【问题标题】:Getting Error "Exception in thread "main" java.lang.ExceptionInInitializerError"获取错误“线程“主”java.lang.ExceptionInInitializerError中的异常”
【发布时间】:2019-05-27 13:52:47
【问题描述】:

我正在尝试使用 Enum Month 初始化 HashMap。但是,收到如下错误:“线程“主”java.lang.ExceptionInInitializerError 中的异常”。请让我知道为什么我会收到此错误。我在静态主类方法和行ChatGroups.initializeMap();

中得到了这个
package static_initialization;

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

public class ChatGroups {
    public static final Map<String, Month> months = new HashMap<String, Month>() {{
        months.put("Jan", Month.January);
        months.put("Feb", Month.February);
        months.put("Mar", Month.March);
        months.put("Apr", Month.April);
        months.put("Jun", Month.June);
        months.put("Jul", Month.July);
        months.put("Aug", Month.August);
        months.put("Sep", Month.September);
        months.put("Oct", Month.October);
        months.put("Nov", Month.November);
        months.put("Dec", Month.December);
    }};

    public static void initializeMap() {
        System.out.println();
    }
}


package static_initialization;

public enum Month {
    January(0),
    February(1),
    March(2),
    April(3),
    May(4),
    June(5),
    July(6),
    August(7),
    September(8),
    October(9),
    November(10),
    December(11);

    private int month;

    Month(int i) {
        month = i;
    }
}


package static_initialization;

public class Main {
    public static void main(String[] args) {
        initializeMaps();
    }
    public static void initializeMaps() {

        try {
            ChatGroups.initializeMap();
        } catch (Exception ex) {
            System.out.println("Neelabh exception = " + ex);
        }
    }
}

请查找堆栈跟踪

Exception in thread "main" java.lang.ExceptionInInitializerError
    at static_initialization.Main.initializeMaps(Main.java:10)
    at static_initialization.Main.main(Main.java:5)
Caused by: java.lang.NullPointerException
    at static_initialization.ChatGroups$1.<init>(ChatGroups.java:9)
    at static_initialization.ChatGroups.<clinit>(ChatGroups.java:8)

【问题讨论】:

  • 请分享完整的堆栈跟踪,错误消息只是其中的一部分。完整的堆栈通常会提供更多信息
  • @Wistler 最后更新了堆栈跟踪。
  • 在静态初始化器中只使用put 而不是months.put
  • @rdas 你能解释一下为什么我需要this.put 而不是months.put
  • 在静态初始化期间,months 指针尚未绑定到您正在定义的地图对象。所以当代码运行时它仍然是空的。

标签: java


【解决方案1】:

应该是:

public static final Map<String, Month> months = new HashMap<String, Month>() {{
    put("Jan", Month.January);
    put("Feb", Month.February);
    put("Mar", Month.March);
    put("Apr", Month.April);
    put("Jun", Month.June);
    put("Jul", Month.July);
    put("Aug", Month.August);
    put("Sep", Month.September);
    put("Oct", Month.October);
    put("Nov", Month.November);
    put("Dec", Month.December);
}};

months.put() 导致 NullPointerException,因为在执行 put 语句时,static 变量 months 仍然是 null

作为替代方案,避免创建匿名类实例,而是编写:

public static final Map<String, Month> months = new HashMap<String, Month>();
static {
    months.put("Jan", Month.January);
    months.put("Feb", Month.February);
    months.put("Mar", Month.March);
    months.put("Apr", Month.April);
    months.put("Jun", Month.June);
    months.put("Jul", Month.July);
    months.put("Aug", Month.August);
    months.put("Sep", Month.September);
    months.put("Oct", Month.October);
    months.put("Nov", Month.November);
    months.put("Dec", Month.December);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多