【问题标题】:HashMap throws unwanted Null Pointer exception [duplicate]HashMap抛出不需要的空指针异常[重复]
【发布时间】:2020-01-06 06:51:00
【问题描述】:

来自Map的java文档

返回指定键映射到的值,如果是 null 此映射不包含键的映射。

但是下面的代码抛出了Null Pointer exception

public class Main {
    public static void main(String args[]) throws Exception {
        boolean bool = false;
        Map<String, Boolean> map = new HashMap<>();
        boolean r = bool ? false : map.get("a");
    }
}

谁能帮我理解这种行为。

【问题讨论】:

标签: java hashmap


【解决方案1】:

这里的问题不在于哈希图,而是将结果自动拆箱为原始布尔值。

用途:

    Map<String, Boolean> map = new HashMap<>();
    Boolean r = map.get("a");

请注意,r 是“大 b”Boolean 包装对象,而不是原始 boolean

正如MadaManu 指出的那样,请注意r 可以是null,这对您的代码的读者来说可能非常令人惊讶。您可能更喜欢使用:

    Map<String, Boolean> map = new HashMap<>();
    boolean r = map.getOrDefault("a", false);

...如果您希望将丢失的密钥视为与false 相同。

【讨论】:

  • 我会小心推荐这个,因为它可能会在代码的后面抛出 NPE,而这只是将问题推开而不解释根本原因。
  • MadaManu:OP 知道在未映射键的情况下映射返回 null
  • 一些地图实现可以存储null值。
【解决方案2】:

get 正在返回 null,因为地图是空的。 NullPointerException 发生在尝试将 ("unbox") null 转换为原始布尔值以赋予三元表达式原始布尔类型的尝试时,与 false 对齐。

甚至从未尝试过分配,因此不相关。

【讨论】:

  • 它实际上是布尔值,但没关系。
  • 其实问题刚刚编辑过
【解决方案3】:

来自JLS 5.1.8. Unboxing Conversion

如果 r 为 null,拆箱转换会抛出 NullPointerException

在您的情况下,map.get("a") 返回 null,然后拆箱会引发此异常。

您可以使用 Boolean 解决方法:

Boolean r = map.get("a");
// here r will be null.

【讨论】:

    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2020-08-10
    相关资源
    最近更新 更多