无法有效地使用Java中的Multi Catch

时间:2015-09-02 05:33:16

标签: java exception try-catch numberformatexception multi-catch

我真的想使用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”已被备选方案捕获   异常。

我理解上面的编译时错误但是我的第一个代码块的替换是什么。

7 个答案:

答案 0 :(得分:10)

NumberFormatExceptionException的子类。说两个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.NumberFormatExceptionjava.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();
}