java - 加载类时未初始化静态变量

标签 java initialization static-members

我有一个关于初始化的有趣问题。我有以下代码:

public class ErrorLookupProvider {  

private static final ErrorLookupProvider INSTANCE = new ErrorLookupProvider();

private  static Map<Long, List<String>> map = new HashMap<Long, List<String>>();

    private ErrorLookupProvider() {
        init();
    }

    private void init() {
        map.put(123L, ImmutableList.of("abc", "def"));
    }

    public static ErrorLookupProvider getInstance() {
        return INSTANCE;
    }
}

现在当我调用 ErrorLookupProvider.getInstance() ,我打了一个NPE。里面的 map init()未使用新的 HashMap 初始化.

如果我更改 map 的声明最终,然后我看到它已初始化。或者,即使我删除 static 并将其设为私有(private)类变量 private Map<.....>这也行。

我还没弄明白为什么会这样。有人可以解释这里发生了什么吗?

最佳答案

切换映射和单例实例初始化的顺序。

静态初始化按照它在源代码中遇到的顺序发生。

参见 JLS 12.4.2 Detailed Initialization Procedure 、第 6 步(final 部分)和第 9 步(“order”部分)。

(单独的问题,单独的问题。)

关于java - 加载类时未初始化静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11059189/

相关文章:

c++ - 组合静态成员和方法

java - jUnit ErrorCollector 报告重复行

java - 删除并重新创建文件/目录

java - 创建一个类来代表一张扑克牌

c - 如何在C编程中初始化多维数组

c++ - 如果构造函数参数与 C++ 中的成员变量同名怎么办?

java - Spring内存使用率过高

c++ - 在构造函数中引用未初始化的对象

c++ - 为什么必须在 main() 之外初始化静态成员?

c++ - 如何在仅 header 库中拥有静态数据成员?