繁体   English   中英

带有三元运算符的 NullPointerException

[英]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。

问题未解决?试试以下方法:

带有三元运算符的 NullPointerException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM