java.lang.ExceptionInInitializerError的原因

简介: java.lang.ExceptionInInitializerError的原因

这个错误是说变量初始化出现问题,通常出现在静态变量尤其是单例模式。这种问题往往是初始化顺序不对造成的,下面举个简单的例子。

[java]  view plain  copy

  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3.  
  4. public class Example {  
  5.  
  6.    private static Example example = new Example();  
  7.      
  8.    private static Map test =  
  9.        new HashMap();  
  10.      
  11.    private Example()  
  12.    {  
  13.        test.put(1, true);  
  14.    }  
  15.      
  16.    public static Example getInstance()  
  17.    {  
  18.        return example;  
  19.    }  
  20. }  

     如果你在别的类调用getInstance,就会报错ExceptionInInitializerError。这是因为类加载时不会为实例变量赋值,对象创建时不会为静态变量赋值。我们调用getInstance时,此类就开始加载,加载的时候不会为实例变量赋值,但是会按顺序给静态变量赋值,所以先为example赋值,然后为test赋值即初始化。但为example赋值时出现了个小插曲,它会调用构造方法创建一个对象。对象创建时不会为静态变量test赋值,而构造器内却已经调用test,于是报错了。

改为:

[java]  view plain  copy

  1. private static Map test =  
  2.        new HashMap();  
  3. private static Example example = new Example();  
相关文章
|
2月前
解决java.lang.ClassCastException
解决java.lang.ClassCastException
40 1
|
8月前
|
Java
java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError
解决办法:java.lang.ExceptionInInitializerError
解决办法:java.lang.ExceptionInInitializerError
182 0
java.lang.UnsupportedOperationException
java.lang.UnsupportedOperationException
92 0
java.lang.UnsatisfiedLinkError异常
读取不到so文件导致的异常
1529 0
|
Java 数据库连接 开发者
java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的区别
java里生成对象有如下两种方式: 1: Object obj = new ClassName(); 直接new一个对象 2: Class clazz = Class.forName(ClassName); Object obj = clazz.newInstance(); 通过class loader动态装载一个类,然后获取这个类的实例同样是生成对象, 同样是生成对象, (一) 在编译期间 1:  在编译期间检查classpath, 如果没有类定义,编译没法通过。
1551 0