提问人:Vic Investa 提问时间:1/31/2023 最后编辑:UnmitigatedVic Investa 更新时间:2/1/2023 访问量:175
带有三元运算符 [duplicate] 的 NullPointerException
NullPointerException with ternary operator [duplicate]
问:
为什么这样做:
String a = null;
String b = a != null && a.equals("Nan") ? "Nan" : a;
System.out.println(b);
但这会产生 NPE:
Double value = null;
Double v = value != null && value.isNaN() ? 0.0 : value;
System.out.println(v);
将其改写为:
Double value = null;
Double v;
if (value != null && value.isNaN()) {
v = 0.0;
} else {
v = value;
}
当然按预期工作。但是为什么我在使用时使用三元/条件运算符获得 NPE,而在使用时没有 NPE?我错过了什么?Double
String
答:
6赞
Unmitigated
1/31/2023
#1
条件表达式的类型被推断为 ,因此当程序尝试拆箱(即 )作为基元时,你会得到一个 。double
NullPointerException
value
null
double
要使表达式具有结果(可以存储),强制转换为 。Double
null
0.0
Double
Double v = value != null && value.isNaN() ? (Double) 0.0 : value
参见§15.25.2。数值条件表达式,了解更多详细信息。
1赞
Panagiotis Bougioukos
2/1/2023
#2
只是为了扩展上面公认的答案,这是重点,但你不妨避免在这里投射。
Double value = null;
Double v = value != null && value.isNaN() ? Double.valueOf(0.0) : value;
System.out.println(v);
将提供第一种类型的条件,该条件将使条件运算符计算为 since 的类型以及 的类型。因此,如果没有条件的参与者是原始类型的,它不会尝试任何拆箱,也不会抛出NPE。Double.valueOf(0.0)
Double
Double
value
Double
double
评论
System.setOut(null);