在执行以下代码时,我在行中得到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);
}
}
有人可以帮助我了解这种行为吗?
答案 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;
在这种情况下,编译器将Double
和double
视为三元条件运算符的第二个和第三个参数,并确定表达式的类型应为double
。因此,它将null
到double
拆箱,得到NullPointerException
。
条件三元运算符的类型由JLS 15.25中的某些表确定。
如果第二和第三操作数是null
和double
,则条件表达式类型是Double
和null
的最小上限,即{{1} }。
如果第二和第三操作数分别为Double
和Double
,则条件表达式类型为double
。
答案 1 :(得分:23)
请参见#jls-15.25:
如果第二个操作数是Double
,而第三个操作数是double
,则结果:
getCount() == 1 ? getDouble() : 1.0
将是double
。
当您尝试将Double null
(由getDouble()
返回)转换为double
时,将抛出NPE
。