超类型和子类型异常处理

Leo*_*Leo 1 java exception-handling exception

考虑这个代码:

public class CheckException 
{
    public static void main(String [] args)
    {       
       int a = 10;
        try{
            int c = a/0;
        } catch(Exception e){

        } catch(ArithmeticException e1){    \\ compilation error

        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

我的疑问是编译错误是在第二次捕获时生成的,因为它已经被超类型异常处理了。但是为什么当第二个 catch 块到达第一个位置和第一个到达第二个位置时编译错误不会出现(如下所示)?

public class CheckException {

public static void main(String [] args){

    int a = 10;
    try{
        int c = a/0;
    } catch(ArithmeticException e){
//       System.out.println("1");   
    } 
    catch(Exception e1){
//          System.out.println("2");
    }
}

}
Run Code Online (Sandbox Code Playgroud)

然后第一个块(即 ArithmeticException)也将在它到达 catch(Exception e)之前处理异常。

修改的

现在我在 catch(Exception e) 之前添加所有未经检查的异常。

public class CheckException {

public static void main(String [] args){

    int a = 10;
    try{
        int c = a/0;
    } catch(ArithmeticException e){
     System.out.println("1");   
    } 
    catch(ArrayIndexOutOfBoundsException e1){
        System.out.println("2");
    }
    catch(ClassCastException  e1){
        System.out.println("2");
    }
    catch(IllegalArgumentException  e1){
        System.out.println("2");
    }
    catch(IllegalStateException  e1){
        System.out.println("2");
    }
    catch(NullPointerException  e1){
        System.out.println("2");
    }
    catch(AssertionError e1){
        System.out.println("2");
    }
    catch(ExceptionInInitializerError  e1){
        System.out.println("2");
    }
    catch(StackOverflowError  e1){
        System.out.println("2");
    }
    catch(NoClassDefFoundError  e1){
        System.out.println("2");
    }
    catch(ArrayStoreException e1){
        System.out.println("2");
    }
    catch(IllegalMonitorStateException e1){
        System.out.println("2");
    }
    catch(IndexOutOfBoundsException e1){
        System.out.println("2");
    }
    catch(NegativeArraySizeException e1){
        System.out.println("2");
    }
    catch(SecurityException e1){
        System.out.println("2");
    }
    catch(UnsupportedOperationException e1){
        System.out.println("2");
    }
    catch(Exception e1){
        System.out.println("2");
    }
}

}
Run Code Online (Sandbox Code Playgroud)

现在,所有未经检查的异常都在到达 catch(Exception e) 之前得到处理。那么,除了这些之外,是否还有未经检查的异常,因为没有生成编译错误?或者是别的什么?

Hoo*_*pje 5

在 Java 中,catch 块按它们在源文件中出现的顺序触发。

因此,如果更一般的Exception首先出现,它也会ArithmeticException在抛出an 时触发,并且第二个 catch 块不可达。

另一方面,如果更具体ArithmeticException的 catch 块首先出现,则 的 catch 块Exception不会变得无法访问,因为Exception第一个块没有捕获它的子类。