请注意,我知道有关
的规则ExceptionInInitializerErrors
它说:任何 静态块中抛出的异常被包装进去 ExceptionInInitializerError 然后抛出 ExceptionInInitializerError 。 但我的问题是:为什么
java.lang.ArrayIndexOutOfBoundsException
它被扔到这里?**
class AX {
static int[] x = new int[0];
static {
x[0] = 10;
}
public static void main(String[] args){
AX ax = new AX();
}
}
答案 0 :(得分:4)
这将创建一个容量为0的数组:
static int[] x = new int[0];
这会将值分配给x
的第一个元素:
static { x[0] = 10; }
不幸的是,如前所述,x
的容量为0,它根本不具备任何元素。这就是你得到ExceptionInInitializerError
的原因。
如果你仔细看看堆栈跟踪, 它会有更多的亮点,因为应该有这样一条线:
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
数字0是超出范围的数组索引: 如果数组不能包含任何元素,则索引0超出范围。
答案 1 :(得分:1)
ArrayIndexOutOfBoundsException
是ExceptionInInitializerError
例外的原因。你真正得到的是:
java.lang.ExceptionInInitializerError
引起:java.lang.ArrayIndexOutOfBoundsException:0
来自ExceptionInInitializerError
的文档:
从版本1.4开始,此异常已经过改进,以符合通用异常链机制。可以在构造时提供并通过getException()方法访问的“已保存的throwable对象”现在称为原因,并且可以通过Throwable.getCause()方法以及前面提到的“遗留方法”来访问。 “
要证明报价:
class X {
static int[] x = new int[0];
static {
x[0] = 10;
}
}
public class Test {
public static void main(String[] args) {
// try catch an error for demoing purposes
try {
X ax = new X();
} catch (Error e) {
System.out.println(e.getClass());
System.out.println(e.getCause());
}
}
}
<强>输出:强>
class java.lang.ExceptionInInitializerError
java.lang.ArrayIndexOutOfBoundsException:0