异常无法有效使用来自Java的多捕获
我真的很想使用Java-1.7中的特性。这一特点之一是“多捕获”。目前我有以下代码
try {
int Id = Integer.parseInt(idstr);
TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));
updateTotalCount(tempTypeInfo);
} catch (NumberFormatException numExcp) {
numExcp.printStackTrace();
} catch (Exception exception) {
exception.printStackTrace();
}
我想从上述代码中删除两个catch块,而是使用如下所示的单个catch:
try {
int Id = Integer.parseInt(idstr);
TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));
updateTotalCount(tempTypeInfo);
} catch (Exception | NumberFormatException ex) { // --> compile time error
ex.printStackTrace();
}
但是上面的代码给出了编译时错误:
"NumberFormatException" is already caught by the alternative Exception.
我理解上面的编译时错误,但我的第一个代码块的替换是什么
# 1 楼答案
multi-catch中的类型必须是不相交的,并且
java.lang.NumberFormatException
是java.lang.Exception
的子类# 2 楼答案
你可以用
# 3 楼答案
^{} 是^{} 的一个子类。说两个
catch
块应该具有相同的行为,就像说对NumberFormatException
没有任何特殊处理,只是对Exception
有相同的一般处理。在这种情况下,您可以省略它的catch
块,而只省略catch Exception
:# 4 楼答案
要添加到Mureinik的解决方案中:
如果要区分每个子类的错误处理,可以在catch块中使用
instanceof
,如下所示:# 5 楼答案
在这种情况下,不需要多捕获,因为
NumberFormatException
是从Exception
派生的。您只需捕获Exception
就可以同时获得这两个属性。如果需要对NumberFormatException
进行另一个处理而不是其他异常,则必须使用首先发布的示例# 6 楼答案
编译器告诉你
还将捕获
NumberFormatException
异常,因为java.lang.NumberFormatException
扩展了java.lang.IllegalArgumentException
,它扩展了java.lang.RuntimeException
,最终扩展了java.lang.Exception