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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值