这个问题通常是静态变量初始化顺序出了问题,通常出现在单例模式中.
code:
import java.util.HashMap;
import java.util.Map;
public class Tom {
private static Tom tom = new Tom();
private static Map<Integer,Boolean> test =
new HashMap<Integer, Boolean>();
private Tom()
{
test.put(1, true);
}
public static Tom getInstance()
{
return tom;
}
public static void main(String[] args){
getInstance();
}
}
输出:
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
at Tom.<init>(Tom.java:12)
at Tom.<clinit>(Tom.java:7)
getInstance()被调用,类被加载,静态变量被初始化,然而在变量tom初始化的时候,构造方法被调用,对象创建的时候不会给静态的test初始化,结果test没有被初始化,
构造器中就直接使用了test.
换个顺序就可以了:
import java.util.HashMap;
import java.util.Map;
public class Tom {
private static Map<Integer,Boolean> test =
new HashMap<Integer, Boolean>();
private static Tom tom = new Tom();
private Tom()
{
test.put(1, true);
}
public static Tom getInstance()
{
return tom;
}
public static void main(String[] args){
getInstance();
}
}