当前位置: 首页 > 知识库问答 >
问题:

收集器映射在Java中值为null时抛出NullPointerException,为什么?[副本]

申屠洛华
2023-03-14
public static void main(String[] args) {
    Map<String, String> m = new HashMap<String, String>();
    m.put("a", "One");
    m.put("b", null);

    toUpperKeys1(m); // NullPointerException
    toUpperKeys2(m); // Working fine
    toUpperKeys3(m); // NullPointerException
}

static Map<String, String> toUpperKeys1(Map<String, String> map) {
    // Scenario 1 : Throwing NullPointerExpecption because Map.Entry::getValue is null
    return map.entrySet().stream().collect(Collectors.toMap(e -> e.getKey().toUpperCase(), Map.Entry::getValue));
}

static Map<String, String> toUpperKeys2(Map<String, String> map) {
    // Scenario 2 : Working fine
    Map<String, String> newMap = new HashMap<String, String>();
    map.entrySet().forEach(e -> newMap.put(e.getKey().toUpperCase(), e.getValue()));
    return newMap;
}

static Map<String, String> toUpperKeys3(Map<String, String> map) {
    // Scenario 3: Throwing NullPointerExpecption because e.getValue() is null
    return map.entrySet().stream().collect(Collectors.toMap(e -> e.getKey().toUpperCase(), e -> e.getValue()));
}
java.lang.NullPointerException
    at java.util.HashMap.merge(HashMap.java:1225)
    at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
    at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1699)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
    at com.project.Demo.toUpperKeys1(Demo.java:25)
    at com.project.Demo.main(Demo.java:17)

因为场景2(for-each循环)运行良好,但是场景1(map.entry::getValue)和场景3(e->e.getValue())都抛出了NPE。

为什么toMap有这个问题,而在哈希映射的概念中,键和值都允许为空?

请解释一下。

共有1个答案

仲孙经赋
2023-03-14

正如收集器::tomap的文档所述

返回的收集器不允许空键和值。

“b”=null中确实存在null值。你错了...不加操纵地设定价值。你当然在“操纵”。

 类似资料:
  • 问题内容: 根据文档,该方法返回: 如果参数是,则字符串等于; 否则,返回的值。 但是,当我尝试这样做时,怎么会这样: 它会抛出NPE吗?(如果你不相信,请自己尝试!) 怎么会这样呢?文件在骗我吗?这是Java中的主要错误吗? 问题答案: 问题是方法已重载: String.valueOf(Object) String.valueOf(char[]) Java规范语言要求在这种情况下,选择最具体的重

  • 我有一段类似这样的代码: 我的测试是: 上面的代码不应该抛出NPE吗? 当我将测试更改为: 然后我的代码正确地抛出了一个空指针异常。 我的测试第一版和第二版有什么区别? 在我的第一个版本中,我告诉mockA返回mockB。但是我也将mockB设置为null,所以当调用b.doSomething()时,我认为该方法应该抛出一个空指针,因为它试图调用null.doSomething()。 我知道我应该

  • 问题内容: 运行此命令时: 响应为: 这对我来说真是太棒了。我本以为这会带来编译时错误。 为什么我可以在Java中抛出null,为什么将其转换为NullPointerException? (实际上,鉴于我抛出的是null,因此我不知道这是否是“ upcast”) 除了一个非常愚蠢的面试问题(请没人在面试中问这个问题)之外,我看不到任何理由。也许您想被解雇,但这就是…我的意思是,为什么还会有人呢?

  • 我有一个想要减少的枚举值流。如果流为空或包含不同的值,我希望。如果它只包含一个值(的多个实例),我想要那个值。 我试着用减音来做: 不幸的是,这不起作用,因为当结果为时,这个reduce方法抛出一个。有人知道为什么会这样吗?为什么不是有效的结果? 现在,我是这样解决的: 在这起作用的同时,我并不满足于这种“弯路”。我喜欢减少,因为它似乎是合适的,把所有的东西都放进一个流。 有没有人能想出一个替代r

  • 原关闭原因未解决 这是我的测试类,它的方法使用NullPointer失败。 正如您所看到的,我甚至尝试在方法中正确初始化时钟,但仍然失败。当我启动应用程序时,它按预期工作。 这是时钟豆 这是个例外 java.lang.NullPointerException:时钟

  • 问题内容: 以下代码抛出: 因为它是静态的,所以我的编译器是否调用null?那没有任何意义! 发生了什么? 问题答案: 这里有两个问题在起作用: 不按照你的想法去做 在这种情况下返回 从到的分配会导致自动取消装箱 由于是被抛出 要解析,你可以使用例如。