有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从映射中获取“null”值

我有HashMap:

Map<String, Object> second = new HashMap<>(Map.of("timeout", 20, "verbose", null, "host", "test"));

第二个映射没有空值。我把他们的。keyset()进行设置,然后开始解析。 当我试图解析它时:

 if (firstMap.containsKey(s) && secondMap.containsKey(s) && !Objects.equals(firstMap.get(s), secondMap.get(s))) {
            diffList.add(Map.of(s, "changed", "oldValue", firstMap.get(s), "newValue", secondMap.get(s)));
        }

我得到NPE。我明白为什么,但我不明白我怎么能解决这个问题。我看到过类似的帖子,但对我没有帮助

Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:208)
at java.base/java.util.ImmutableCollections$MapN.<init>(ImmutableCollections.java:1186)
at java.base/java.util.Map.of(Map.java:1351)
at com.company.Main.main(Main.java:13)

共 (4) 个答案

  1. # 1 楼答案

    ^{}不允许null值。引用Javadoc:

    Unmodifiable Maps
    They disallow null keys and values. Attempts to create them with null keys or values result in NullPointerException.

    相反,您可以直接调用put

    Map<String, Object> second = new HashMap<>();  // `HashMap` permits null values and null key.
    second.put("timeout", 20);
    second.put("verbose", null);
    second.put("host", "test");
    
  2. # 3 楼答案

    Map.of既不允许null键,也不允许null值。如果我正确地获得了代码,您最终将处理键verbose,它在您的映射中有一个nullsecond

    参考资料:

  3. # 4 楼答案

    地图。关于()和Map。ofEntries()静态工厂方法提供了一种创建不可变映射的方便方法。通过这些方法创建的地图实例具有以下特征:

    。。。 它们不允许空键和值。尝试使用空键或值创建它们会导致NullPointerException