考虑以下代码:
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)。那么,除了这些之外是否还有未经检查的异常,因为没有生成编译错误?还是别的什么?
答案 0 :(得分:4)
在Java中,catch块按它们在源文件中出现的顺序触发。
因此,如果更一般的Exception
首先出现,如果抛出一个ArithmeticException
,它也将触发,并且第二个catch块无法访问。
另一方面,如果更具体的ArithmeticException
的catch块首先出现,那么Exception
的catch块不会变得无法访问,因为有Exception
的子类没有被第一个区块抓住。
答案 1 :(得分:1)
更具体的例外 - ArithmeticException
- 应该首先出现,因为它允许您以不同于Exception
的一般处理方式处理它。
如果先放置异常处理程序或Exception
,则会使ArithmeticException
死代码的处理程序,因为它永远无法到达 - 任何ArithmeticException
将被处理程序捕获Exception
。