码迷,mamicode.com
首页 > 编程语言 > 详细

java.lang.ExceptionInInitializerError

时间:2014-07-16 21:38:53      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   java   color   strong   

 

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

 

java.lang.ExceptionInInitializerError,布布扣,bubuko.com

java.lang.ExceptionInInitializerError

标签:style   blog   http   java   color   strong   

原文地址:http://www.cnblogs.com/mjorcen/p/3835874.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!