考虑这段代码:
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
}
}
}
我怀疑编译错误是在第二次捕获时产生的,因为它已经被父类(super class)型异常处理了。但是为什么当第二个 catch block 到达第一个位置并且第一个到达第二个位置时(如下所示)不会出现编译错误?
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");
}
}
}
然后第一个 block (即 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(Exception e) 之前得到处理。那么,除了这些未产生编译错误之外,是否还有未检查的异常?还是其他原因?
最佳答案
在 Java 中,catch block 按照它们在源文件中出现的顺序触发。
因此,如果更一般的 Exception
先出现,如果抛出 ArithmeticException
并且无法访问第二个 catch block ,它也会触发。
另一方面,如果更具体的 ArithmeticException
的 catch block 先出现,那么 Exception
的 catch block 不会变得不可访问,因为有子类未被第一个 block 捕获的 Exception
。
关于java - 父类(super class)型和子类型异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27247531/