从映射获取"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)

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。

相关内容

  • 没有找到相关文章