[英]NullPointerException with ternary operator
为什么这样做:
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;
}
当然按预期工作。 但是为什么我在使用Double
时使用三元/条件运算符得到 NPE 而在使用String
时没有 NPE? 我错过了什么?
条件表达式的类型被推断为double
,因此当程序尝试将value
(即null
)拆箱为原始double
时,您会得到一个NullPointerException
。
要使表达式具有Double
结果(可以存储null
),请将0.0
转换为Double
。
Double v = value != null && value.isNaN() ? (Double) 0.0 : value
请参阅第 15.25.2 节。 有关更多详细信息,请参阅数值条件表达式。
只是为了扩展上面接受的答案,但你也可以避免在这里投射。
Double value = null;
Double v = value != null && value.isNaN() ? Double.valueOf(0.0) : value;
System.out.println(v);
Double.valueOf(0.0)
将在第一种条件类型中提供一个Double
,这将使条件运算符评估为Double
类型,因为value
也是Double
类型。 因此,如果条件的参与者都不是原始类型double
,它就不会尝试任何拆箱操作,也不会抛出 NPE。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.