Java 在构造函数中使用时,通过工厂方法延迟实例化常量会引发错误

Java 在构造函数中使用时,通过工厂方法延迟实例化常量会引发错误,java,exception,static,initialization,Java,Exception,Static,Initialization,当构造函数使用对正在被延迟实例化的常量的引用时,java抛出ExceptionInInitializerError(特别是在“this(ClassA.INSTANCE1)”行上) 所以,我的问题是,为什么Java不能处理我之前所做的事情。错误的原因是什么?为什么 非常感谢 我认为您的问题在于您试图在多通映射之前初始化实例1,但是实例1的实例化取决于多通映射 例如,当您调用MULTITON\u MAP.get(name)时在get中,multi-ton\u-MAP仍然为空。私有静态最终映射mult

当构造函数使用对正在被延迟实例化的常量的引用时,java抛出ExceptionInInitializerError(特别是在“this(ClassA.INSTANCE1)”行上)

所以,我的问题是,为什么Java不能处理我之前所做的事情。错误的原因是什么?为什么


非常感谢

我认为您的问题在于您试图在
多通映射
之前初始化
实例1
,但是
实例1
的实例化取决于
多通映射

例如,当您调用
MULTITON\u MAP.get(name)时
get
中,
multi-ton\u-MAP
仍然为空。

私有静态最终映射multi-ton\u-MAP=new HashMap();
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");
public static final ClassA INSTANCE1=get(“INSTANCE1”); public static final ClassA INSTANCE2=get(“INSTANCE2”);

您试图在初始化映射之前初始化实例。

Ah!所以在加载ClassA之前调用了ClassA.get()方法,所以没有实例化MULTITON_映射?我以为它会在加载ClassA时被实例化。是的,但也有
INSTANCE1
INSTANCE2
,显然,它们是在
MULTITON\u MAP
Hmm之前被实例化的。。。因此,静态变量是按照它们列出的顺序实例化的。有道理,谢谢!我没意识到事情这么简单。英雄联盟
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);
    }

    ...
}
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");