【发布时间】:2014-12-02 10:49:37
【问题描述】:
考虑这段代码:
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 块到达第一个位置并且第一个到达第二个位置时(如下所示)没有出现编译错误?
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(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");
}
}
}
现在,所有未经检查的异常都在到达 catch(Exception e) 之前得到处理。那么,除了这些之外是否还有未经检查的异常,因为没有生成编译错误?还是别的什么?
【问题讨论】:
-
因为除了
ArithmeticException之外还有未勾选的Exceptions。 -
你不需要为 try 块中的逻辑设置第二个 catch 块。仅当它抛出 ArithmeticException 以外的情况时,控制才转到第二个 catch 块(异常)。因此,您仍然可以编写第二个 catch 块,这完全没有问题。
-
@MarkoTopolnik 如果我在最后一个块之前添加所有未经检查的异常怎么办?会一样吗?
-
我添加了一些代码。请往上看。
-
不会,因为你不知道运行时可能会抛出哪些未经检查的异常。编译时和运行时的类路径完全不同,异常类也可能是动态生成的。
标签: java exception exception-handling