有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

异常无法有效使用来自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.

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


共 (6) 个答案

  1. # 1 楼答案

    multi-catch中的类型必须是不相交的,并且java.lang.NumberFormatExceptionjava.lang.Exception的子类

  2. # 2 楼答案

    你可以用

        try {
        int Id = Integer.parseInt(idstr);
    
        TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));
    
        updateTotalCount(tempTypeInfo);
      } catch (Exception exception) {
        exception.printStackTrace();
      } 
    
  3. # 3 楼答案

    ^{}^{}的一个子类。说两个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();
    } 
    
  4. # 4 楼答案

    要添加到Mureinik的解决方案中:

    如果要区分每个子类的错误处理,可以在catch块中使用instanceof,如下所示:

    FileNotFoundException is subclass of IOException
    
    catch (IOException e) {
                if (e instanceof FileNotFoundException)
                {
                    System.out.println("FileNotFoundException");
                }
                else if(e instanceof IOException)
                {
                    System.out.println("IOException");
                }
    
            }
    
  5. # 5 楼答案

    在这种情况下,不需要多捕获,因为NumberFormatException是从Exception派生的。您只需捕获Exception就可以同时获得这两个属性。如果需要对NumberFormatException进行另一个处理而不是其他异常,则必须使用首先发布的示例

  6. # 6 楼答案

    编译器告诉你

    } catch (Exception ex) {
    

    还将捕获NumberFormatException异常,因为java.lang.NumberFormatException扩展了java.lang.IllegalArgumentException,它扩展了java.lang.RuntimeException,最终扩展了java.lang.Exception