任何Throwable都可以被抓住
class CatchThrowable {
public static void main(String[] args){
try{
throw new Throwable();
} catch (Throwable t){
System.out.println("throwable caught!");
}
}
}
输出:
throwable caught!
因此,如果我在初始化块期间做了一些不好的事情,我希望能够捕获ExceptionInInitializerError。但是,以下不起作用:
class InitError {
static int[] x = new int[4];
static { //static init block
try{
x[4] = 5; //bad array index!
} catch (ExceptionInInitializerError e) {
System.out.println("ExceptionInInitializerError caught!");
}
}
public static void main(String[] args){}
}
输出:
java.lang.ExceptionInInitializerError
Caused by: java.lang.ArrayIndexOutOfBoundsException: 4
at InitError.<clinit>(InitError.java:13)
Exception in thread "main"
如果我更改代码以另外捕获ArrayIndexOutOfBoundsException
class InitError {
static int[] x = new int[4];
static { //static init block
try{
x[4] = 5; //bad array index!
} catch (ExceptionInInitializerError e) {
System.out.println("ExceptionInInitializerError caught!");
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("ArrayIndexOutOfBoundsException caught!");
}
}
public static void main(String[] args){}
}
它被捕获的ArrayIndexOutOfBoundsException:
ArrayIndexOutOfBoundsException caught!
有谁可以告诉我为什么会这样?
答案 0 :(得分:3)
顾名思义,ExceptionInInitializerError
是一个错误,不是例外。与例外情况不同,errors are not meant to be caught。它们表示致命的不可恢复的状态,并且意味着停止你的计划。
ExceptionInInitializerError
表示static
变量的初始值设定项引发了一个未被捕获的异常 - 在您的情况下,它是ArrayIndexOutOfBoundsException
,但任何异常都会导致此错误。由于静态初始化发生在正在运行的程序的上下文之外,因此无法传递异常。这就是为什么Java会产生错误而不是传递异常的原因。