这个问题在这里已有答案:
执行以下代码时,我得到一个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);
}
}
有人能帮我理解这种行为吗?
当你写作
value = condition ? null : 1.0;
condition ? null : 1.0
的类型必须是引用类型,因此类型为Double
,它可以保存值null
。
当你写作
value = condition ? getDouble() : 1.0;
和getDouble()
返回null
,它相当于写作:
value = condition ? ((Double) null) : 1.0;
在这种情况下,编译器将Double
和double
视为三元条件运算符的第2和第3个参数,并确定表达式的类型应为double
。因此,它将null
拆箱到double
,获得NullPointerException
。
条件三元运算符的类型由JLS 15.25中的一些表确定。
如果第二和第三个操作数是null
和double
,则条件表达式类型是Double
和null
的最小上界,即Double
。
如果第二个和第三个操作数是Double
和double
,则条件表达式类型是double
。
如果第二个操作数是Double
,而第三个操作数是double
,结果如下:
getCount() == 1 ? getDouble() : 1.0
将是一个double
。
当你试图将Double null
(由getDouble()
返回)转换为double
时,NPE
将被抛出。