我真的想使用Java-1.7中的功能。其中一个功能是“Multi-Catch”。目前我有以下代码
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”已被备选方案捕获 异常。
我理解上面的编译时错误但是我的第一个代码块的替换是什么。
答案 0 :(得分:10)
NumberFormatException
是Exception
的子类。说两个catch
块应该具有相同的行为就像是说你没有NumberFormatException
的任何特殊处理,只是对Exception
的一般处理。在这种情况下,您可以省略其catch
块并仅忽略catch Exception
:
try {
int Id = Integer.parseInt(idstr);
TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));
updateTotalCount(tempTypeInfo);
} catch (Exception exception) {
exception.printStackTrace();
}
答案 1 :(得分:3)
编译器告诉你
} catch (Exception ex) {
还会捕获NumberFormatException
个例外,因为java.lang.NumberFormatException
扩展了java.lang.IllegalArgumentException
,扩展了java.lang.RuntimeException
,最终扩展了java.lang.Exception
。
答案 2 :(得分:2)
multi-catch中的类型必须是不相交的,java.lang.NumberFormatException
是java.lang.Exception
的子类。
答案 3 :(得分:1)
在这种情况下,不需要多次捕获,因为NumberFormatException
来自Exception
。您只需捕获Exception
即可获取它们。如果您需要另外处理NumberFormatException
而不是其他例外,则必须使用您首先发布的示例。
答案 4 :(得分:1)
你可以使用
try {
int Id = Integer.parseInt(idstr);
TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));
updateTotalCount(tempTypeInfo);
} catch (Exception exception) {
exception.printStackTrace();
}
答案 5 :(得分:1)
添加到Mureinik的解决方案:
如果您想区分每个子类的错误处理,可以在catch块中使用TEXT_DIRECTION_RTL
,例如:
instanceof
答案 6 :(得分:0)
Exception
是所有异常的父类,理想情况下(首选方法 - 最佳编码实践),你永远不应该捕获Exception
,除非你不确定在运行时会尝试什么块。
因为在你的代码中你正在进行NumberFormat操作,这是一个Exception的子类,你不应该捕获Exception(除非其他2个方法可能抛出未经检查的异常),而是使用:
try {
int Id = Integer.parseInt(idstr);
TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));\
updateTotalCount(tempTypeInfo);
} catch (NumberFormatException npe) {
npe.printStackTrace();
}