gpt4 book ai didi

java - 为什么我在从静态 block 中初始化的构造函数访问 Hashmap 时收到 ExceptionInInitializerError

转载 作者:行者123 更新时间:2023-12-02 06:48:02 24 4
gpt4 key购买 nike

package test;

import java.util.HashMap;

class Check {
private static Check check = new Check();
private static HashMap<String,String> map = new HashMap<String, String>();
static{
System.out.println("***********In static block***********");
Check.map.put("1", "One");
Check.map.put("2","Two");
}
private Check(){
System.out.println("Map Contains "+map.get("1"));
}

public static Check getCheck() {
return Check.check;
}

}
public class CheckStatic{
public static void main(String[] args) {
Check.getCheck();
}
}

我创建了具有静态 block 的 Singleton 类。在静态 block 中,我已经初始化了 HashMap 并尝试在 Singletion 类的构造函数中访问它。但是我收到了异常InInitializerError。请建议我正在尝试哪些是错误的......

最佳答案

问题是这样的:

private static Check check = new Check(); 

在构造函数中你有

System.out.println("Map Contains "+map.get("1"));

因此,您遇到了第 22 条军规的情况:您希望映射在构造函数运行之前存在,并且您希望构造函数在初始化映射之前运行。

您需要做的就是将 check 单例的声明放在用于设置映射的静态初始值设定项下方。此时构造函数将可以安全运行。

作为旁注,将check变量设置为final。这是单例的标准,并且有一个很好的理由:它保证只有一个实例。

关于java - 为什么我在从静态 block 中初始化的构造函数访问 Hashmap 时收到 ExceptionInInitializerError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18376534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com