从地图中获取 "null" 值

Getting "null" value from map

我有 HashMap:

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

第二张地图没有空值。我将他们的 .keyset() 设置为 Set 然后开始解析。 当我试图解析它时:

 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)

Map.of 不允许 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");

Map.of 不允许 null 键和 null 值。如果我得到你的代码正确,你最终会处理在你的地图 second.

中有一个 null 值的键 verbose

参考文献:

根据堆栈跟踪,映射是 ImmutableCollections,ImmutableCollections 不支持空值。

https://docs.oracle.com/javase/9/core/creating-immutable-lists-sets-and-maps.htm#JSCOR-GUID-1222F8A3-7EC0-4E49-9B75-C3B263F9A1BB

Map.of() 和 Map.ofEntries() 静态工厂方法提供了一种创建不可变映射的便捷方法。这些方法创建的Map实例具有以下特点:

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