三元运算符中不需要的NullPointerException-为什么? [重复]

问题描述 投票:47回答:2

[在执行以下代码时,我在行中得到了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);
    }
}

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

java nullpointerexception double conditional-operator
2个回答
78
投票

写作时

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的最小上限,即Double

如果第二和第三操作数是Doubledouble,则条件表达式类型是double


25
投票

请参见#jls-15.25

enter image description here

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

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

将为double

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

© www.soinside.com 2019 - 2024. All rights reserved.