gpt4 book ai didi

java - 为什么拆箱方法调用参数不会导致有用的 NullPointerException

转载 作者:行者123 更新时间:2023-12-05 01:03:48 25 4
gpt4 key购买 nike

我调查了 Java 14 中有用的 NullPointerExceptions,并测试了不同的场景。令人惊讶的是,拆箱似乎在某些情况下会导致有用的 NPE,而其他情况下则不包含任何错误消息:

// NPE with message 'Cannot invoke "java.lang.Integer.intValue()" because "index" is null'
Integer index = null;
int i = index;

// NPE with message null
List.of('a', 'b', 'c').indexOf(index);

我想知道,为什么第二个示例不会导致与第一个示例相同的消息。我阅读了 JEP 358 并了解到该消息是根据字节码指令计算的。这两个场景有什么不同吗?我希望两个 snearios 都调用 Integer.intValue() 来拆箱值。

(使用 Oracle JDK 17.0.4.1 测试)

最佳答案

原因是因为原因不同。 List.of 创建的 List 不允许空值,当 indexOf 收到 null 时,它只是抛出 NullPointerException 而没有消息:

@Override
public int indexOf(Object o) {
if (!allowNulls && o == null) {
throw new NullPointerException();
}
Object[] es = elements;
for (int i = 0; i < es.length; i++) {
if (Objects.equals(o, es[i])) {
return i;
}
}
return -1;
}

(来自 java.util.ImmutableCollections.ListN 类)

另一方面,在 int i = index; 的情况下,它被编译为等价于 int i = index.intValue();,并且JVM根据所涉及的方法调用和变量生成NullPointerException的消息。

关于java - 为什么拆箱方法调用参数不会导致有用的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73499206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com