为什么ExceptionInInitializerError在这里?

时间:2015-08-19 20:48:14

标签: java exception-handling static

请注意,我知道有关

的规则
  

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();
    }
}

2 个答案:

答案 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)

ArrayIndexOutOfBoundsExceptionExceptionInInitializerError例外的原因。你真正得到的是:

  

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