首页 > 解决方案 > 为什么三元运算符在自动拆箱的情况下会抛出 NPE?

问题描述

在以下测试中,getDummyAge()不应评估该方法,因为testage变量始终为null

public class IntegerTest {
    @Test
    public void intergerTestFailure() {
        Integer testage = null;
        Integer age = (testage != null) ? getDummyAge() : testage;
    }

    private int getDummyAge() {
        return 0;
    }
}

虽然这会引发异常:

java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 的 my.IntegerTest.intergerTestFailure(IntegerTest.java:18) 的 java.lang.NullPointerException java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566)

这是一个jdk错误吗?

标签: java

解决方案


Integer age = (testage != null) ? getDummyAge() : testage;

相当于

Integer age = Integer.valueOf((testage != null) ? getDummyAge().intValue() : testage);

因为不同类型的数字第二和第三个操作数经历二进制数字提升;条件运算符的结果是int,然后必须将其装回以Integer进行赋值。

这是指定的。

如果你想避免 NPE,请int明确框:

Integer age = (testage != null) ? Integer.valueOf(getDummyAge()) : testage;

相同类型的盒装数字操作数不会被拆箱。


推荐阅读