超类型和子类型异常处理

时间:2014-12-02 10:49:37

标签: 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

        }
    }   
}

我怀疑编译错误是在第二次捕获时生成的,因为它已经由超类型Exception处理。但是,当第二个阻塞块到达第一个位置并且首先进入第二个位置时(如下所示),为什么编译错误不会出现?

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

}

然后第一个块(即ArithmeticException)将在它到达catch之前处理异常(例外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");
    }
}

}

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

2 个答案:

答案 0 :(得分:4)

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

因此,如果更一般的Exception首先出现,如果抛出一个ArithmeticException,它也将触发,并且第二个catch块无法访问。

另一方面,如果更具体的ArithmeticException的catch块首先出现,那么Exception的catch块不会变得无法访问,因为有Exception的子类没有被第一个区块抓住。

答案 1 :(得分:1)

更具体的例外 - ArithmeticException - 应该首先出现,因为它允许您以不同于Exception的一般处理方式处理它。

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