在三元运算符中获取不需要的NullPointerException-为什么?

时间:2018-09-03 09:49:38

标签: java nullpointerexception double conditional-operator

在执行以下代码时,我在行中得到NullPointerException

value = condition ? getDouble() : 1.0;

在前面的几行中,当我使用null而不是getDouble()时,一切正常,这很奇怪。

public class Test {
    static Double getDouble() {
        return null;
    }

    public static void main(String[] args) {
        boolean condition = true;
        Double value;

        value = condition ? null : 1.0;         //works fine
        System.out.println(value);              //prints null

        value = condition ? getDouble() : 1.0;  //throws NPE
        System.out.println(value);
    }
}

有人可以帮助我了解这种行为吗?

2 个答案:

答案 0 :(得分:77)

写作时

value = condition ? null : 1.0;

condition ? null : 1.0的类型必须是引用类型,因此类型为Double,它可以容纳值null

写作时

value = condition ? getDouble() : 1.0;

getDouble()返回null,相当于编写:

value = condition ? ((Double) null) : 1.0;

在这种情况下,编译器将Doubledouble视为三元条件运算符的第二个和第三个参数,并确定表达式的类型应为double。因此,它将nulldouble拆箱,得到NullPointerException

条件三元运算符的类型由JLS 15.25中的某些表确定。

如果第二和第三操作数是nulldouble,则条件表达式类型是Doublenull的最小上限,即{{1} }。

如果第二和第三操作数分别为DoubleDouble,则条件表达式类型为double

答案 1 :(得分:23)

请参见#jls-15.25

enter image description here

如果第二个操作数是Double,而第三个操作数是double,则结果:

getCount() == 1 ? getDouble() : 1.0

将是double

当您尝试将Double null(由getDouble()返回)转换为double时,将抛出NPE