zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ACM HDU 1176 免费馅饼(DP)
    PHP下载时中文文件名乱码的问题
    NYOJ 27
    NYOJ 148
    NYOJ 8
    NYOJ 138
    NYOJ 461
    POJ 1200
    STL排序算法
    NYOJ 523
  • 原文地址:https://www.cnblogs.com/mjorcen/p/3835874.html
Copyright © 2011-2022 走看看