我有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)
Map.of
不允许null
值。引用Javadoc:
无法改变的地图
它们禁止使用null
键和值。尝试使用空键或空值创建它们会导致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
值。如果我得到你的代码正确,你将最终处理的关键verbose
有一个null
值在你的地图second
。
引用:
-
Javadoc Map.of
-
不可变映射工厂方法
根据stacktrace,映射是ImmutableCollections, ImmutableCollections中不支持空值
https://docs.oracle.com/javase/9/core/creating-immutable-lists-sets-and-maps.htm jscor guid - 1222 f8a3 - 7 - ec0 4 - e49 - 9 - b75 c3b263f9a1bb
Map.of()和Map.ofEntries()静态工厂方法提供了一种创建不可变映射的方便方法。由这些方法创建的Map实例具有以下特征:
…它们不允许空键和空值。尝试用空键或空值创建它们将导致NullPointerException。