Java 超类型和子类型异常处理

Java 超类型和子类型异常处理,java,exception,exception-handling,Java,Exception,Exception Handling,考虑以下代码: 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

考虑以下代码:

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

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

然后,第一个块(即算术异常)也将在到达catch(异常e)之前处理异常

已修改

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


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

更具体的异常-
算术异常
,应该放在第一位,因为它允许您以不同于
异常
的一般处理方式来处理它


如果先放置异常处理程序或
异常
,则会使处理程序成为
算术异常
死代码,因为它永远无法到达-任何
算术异常
都将被
异常
的处理程序捕获

更具体的异常-
算术异常
-应该放在第一位,因为它允许您以与
异常
的一般处理不同的方式处理它


如果首先放置异常处理程序或
异常
,则会使
算术异常
的处理程序成为死代码,因为它永远无法到达-任何
算术异常
都会被Java中
异常

的处理程序捕获,捕捉块将按它们在源文件中的显示顺序触发

因此,如果更一般的
异常
首先出现,则在抛出
算术异常
且第二个catch块不可访问时也会触发该异常


另一方面,如果更具体的
算术异常
的catch块首先出现,那么
异常
的catch块就不会变得不可访问,因为有
异常
的子类没有被第一个块捕获,捕捉块将按它们在源文件中的显示顺序触发

因此,如果更一般的
异常
首先出现,则在抛出
算术异常
且第二个catch块不可访问时也会触发该异常


另一方面,如果更具体的
算术异常
的catch块首先出现,则
异常
的catch块不会变得不可访问,因为有
异常
的子类未被第一个块捕获。

因为除了
算术异常
之外,还有未选中的
异常
s。try块内的逻辑不需要第二个catch块。控件只有在抛出算术异常以外的异常时才会转到第二个catch块(异常)。因此,您仍然可以编写第二个catch块,这根本不会引起任何问题。@MarkoTopolnik如果我在最后一个块之前添加所有未检查的异常,会怎么样?它会是一样的吗?我添加了一些代码。请看上面。这不会发生,因为您不知道在运行时可能会抛出哪些未检查的异常。编译时和运行时类路径完全不同,异常类也可以动态生成。因为除了
算术异常
之外,还有未选中的
异常
。对于try块中的逻辑,不需要第二个catch块。控件只有在抛出算术异常以外的异常时才会转到第二个catch块(异常)。因此,您仍然可以编写第二个catch块,这根本不会引起任何问题。@MarkoTopolnik如果我在最后一个块之前添加所有未检查的异常,会怎么样?它会是一样的吗?我添加了一些代码。请看上面。这不会发生,因为您不知道在运行时可能会抛出哪些未检查的异常。编译时类路径和运行时类路径完全不同,异常类也可以动态生成。
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");
    }
}

}
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");
    }
}

}