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

问题描述 投票:48回答: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个回答
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视为三元条件运算符的第2和第3个参数,并确定表达式的类型应为double。因此,它将null拆箱到double,获得NullPointerException

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

如果第二和第三个操作数是nulldouble,则条件表达式类型是Doublenull的最小上界,即Double

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


23
投票

#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.