我研究了Java 14中有用的NullPointerExceptions,并测试了不同的场景.令人惊讶的是,在某些场景中,取消装箱似乎会导致Helfpul 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,了解到消息是根据字节码指令进行计算的.这两个场景有什么不同吗?我以为这两个偷偷摸摸的人都会调用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相关问答推荐

如何审查Java dtos中的自定义注释字段?

在Java中测试DAO方法:假实现与内存数据库

ittext pdf延迟签名,签名无效

有没有一种方法使保持活动设置专用于java.net.http.HttpClient的一个实例

JavaFX Maven Assembly插件一直打包到错误的JDK版本

扩展到弹出窗口宽度的JavaFX文本字段

在JavaFX项目中注册组合框的控件FX验证器时,模块系统出错

从Spring5迁移到Spring6:无法在雅加达包中找到类

按属性值从流中筛选出重复项

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

如何解释Java中for-each循环中对Iterable的强制转换方法引用?

如何在我的世界中为互动增加冷却时间?

舰队运行配置Maven版本

在Oracle db中,当我们提供字符串而不是数字时,比较是如何工作的?

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

JavaFX,GridPane:在GridPane的列中生成元素将保持所有列的宽度

为什么没有加载java.se模块?

控制器建议异常处理

简化每个元素本身都是 map 列表的列表

如何显示新布局