【问题标题】:Null pointer exception with static Map静态映射的空指针异常
【发布时间】:2011-09-23 03:36:14
【问题描述】:

现在是凌晨 5 点,我有点睡着了,所以可能是这样(我对 Java 也比较陌生)。但我不明白为什么这段代码会用这段代码生成 Null Exception。到时候地图应该已经初始化了吧?

private static final Map<String, Integer> CONDS_MAP = 
    Collections.unmodifiableMap
    (
        new HashMap<String, Integer>()
            {{ 
                put("null", 0);
                put("false", 0);
                put("true", 1);
                put("numElems.lt", 2);
                put("NELT", 2);
                put("numElems.gt", 3);
                put("NEGT", 3);
            }}
    );

private int getCodeInt(Object code)
{
    if (code.getClass() == String.class)
    {
        return CONDS_MAP.get((String)code); // Null Exception here
    }
    else
    // (... etc etc)
}

谢谢!对不起,它太微不足道了......

【问题讨论】:

  • 无关,但尽量避免使用双括号 HashMap 初始化器,code.getClass() == String.class 应该是 code instanceof String(更容易阅读,输入更快,避免可能的 NPE)。
  • @Thilo - 实例初始化程序有什么问题?
  • @Ted:它创建了 HashMap 的(不必要的)子类。
  • @Thilo:谢谢你的推荐!

标签: java exception static initialization


【解决方案1】:

这很可能是由于试图对从不存在的键返回的 null 进行拆箱。

return CONDS_MAP.get((String)code);

相同
return CONDS_MAP.get(code).intValue();

如果 Map 返回 null,最后一个 intValue 将失败。

【讨论】:

  • 我可以发誓我把点放在那个 json 中......但是不,代码是“numElemsgt”。谢谢。睡觉可能会有所帮助。我也会检查空值。
  • 不同的字符串应该返回相同的 int。 (我会更新示例)
  • 当然,但你仍然可以说put(NUM_ELEMS_GT, 3); 而不是put("numElems.gt", 3);
  • 我不认为它对我有用:我用于从 JSON 文件读取数据,并将文件中的一些字符串转换为稍后将被切换的整数代码。
【解决方案2】:

是的,到时候已经初始化了,nullpointerexception可能是空键引起的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多