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) 之前得到处理。那么,除了这些之外,是否还有未经检查的异常,因为没有生成编译错误?或者是别的什么?
在 Java 中,catch 块按它们在源文件中出现的顺序触发。
因此,如果更一般的Exception首先出现,它也会ArithmeticException在抛出an 时触发,并且第二个 catch 块不可达。
另一方面,如果更具体ArithmeticException的 catch 块首先出现,则 的 catch 块Exception不会变得无法访问,因为Exception第一个块没有捕获它的子类。
| 归档时间: |
|
| 查看次数: |
1525 次 |
| 最近记录: |