为什么三元运算符在自动拆箱的情况下会抛出NPE?

时间:2019-03-25 16:37:21

标签: java

在以下测试中,不应评估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.lang.NullPointerException在   my.IntegerTest.intergerTestFailure(IntegerTest.java:18)在   java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机   方法)   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的错误吗?

1 个答案:

答案 0 :(得分:1)

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;

没有装箱的相同类型的数字操作数。