今天写了个小程序,出现了个异常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