当构造函数使用对延迟实例化的常量的引用时,java会抛出ExceptionInInitializerError(特别是在“this(ClassA.INSTST1)”行上。)
public class ClassA {
public static final ClassA INSTANCE1 = get("INSTANCE1");
public static final ClassA INSTANCE2 = get("INSTANCE2");
private static final Map<String, ClassA> MULTITON_MAP = new HashMap<String, ClassA>();
private String name;
private ClassA(String name) {
this.name = name;
}
public static ClassA get(String name) {
ClassA toReturn = MULTITON_MAP.get(name);
if (toReturn == null) {
toReturn = new ClassA(name);
MULTITON_MAP.put(name, toReturn);
}
return toReturn;
}
}
public class ClassB {
private ClassA type;
public ClassB() {
this(ClassA.INSTANCE1);
}
public ClassB(ClassA type) {
this.type = type;
}
public static void main(String[] args) {
new ClassB();
}
}
我通过删除惰性实例化并将实例化移动到静态块中解决了这个问题。
public class ClassA {
public static final ClassA INSTANCE1;
public static final ClassB INSTANCE2;
...
static {
INSTANCE1 = new ClassA("INSTANCE1");
INSTANCE2 = new ClassA("INSTANCE2");
MULTITON_MAP.put("INSTANCE1", INSTANCE1);
MULTITON_MAP.put("INSTANCE2", INSTANCE2);
}
...
}
所以,我的问题是,为什么Java无法处理我以前做过的事情。导致错误的原因是什么?
非常感谢!
答案 0 :(得分:1)
我认为您的问题是您尝试在INSTANCE1
之前初始化MULTITON_MAP
,但INSTANCE1
的实例化取决于MULTITON_MAP
。
E.g。当您在MULTITON_MAP.get(name);
中致电get
时,MULTITON_MAP
仍为空。
答案 1 :(得分:1)
private static final Map<String, ClassA> MULTITON_MAP = new HashMap<String, ClassA>();
public static final ClassA INSTANCE1 = get("INSTANCE1");
public static final ClassA INSTANCE2 = get("INSTANCE2");
您在初始化地图之前尝试初始化实例。