首页 > 代码库 > java.lang.ExceptionInInitializerError

java.lang.ExceptionInInitializerError

 

今天写了个小程序,出现了个异常java.lang.ExceptionInInitializerError,就是它了。最后我就重新写了个类进行测试。下面是会出错的代码。 

 

package test;import java.util.Arrays;public class AA {    private static int[] a = new int[4];    private static AA aa = new AA();    boolean[] flag = new boolean[5];    private static char[] ad = new char[4];    private AA() {// 构造方法        init();    }    public static AA getAA() {// 得到单态实例        return aa;    }    public void init() {        Arrays.fill(ad, ‘d‘);// 此处将会出错        Arrays.fill(a, 1);// 此处不会出错        Arrays.fill(flag, true);// 此处也不会出错,用作对比        System.out.println(a[0]);    }    /** * @param args */    public static void main(String[] args) {        new AA();    }}

问题补充
private static AA aa = new AA();把这个语句放在最后面就行了啊!

 

你可以找本书,看看类加载和对象创建的部分,然后你就知道为什么了。 
我简单给你说下,你的a,aa,ad都是静态的,在类加载的时候,会按顺序给他们创建空间, 
a创建了4个int,到了aa,aa是个自定义的对象,调用其无参构造方法,然后,在调用init()前 
JVM会先初始化类中非静态属性flag,为flag创建了5个boolean,然后调用其init(), 
而在init()中你调用了未初始化的ad,ad此时为空,异常就出来了。

 

类加载时不会为实例变量赋值,对象创建时不会为静态变量赋值。 
初始化是一个过程,不是cpu一次运算就能完成的,在这个过程中出了点小插曲(创建了AA对象),导致实例变量先于静态变量初始化。 
你可以debug看一下他的执行过程,其实就是一个先后顺序的问题

 

感谢 : http://www.iteye.com/problems/63433