三元运算符引发NPE:String与Double的行为差异探究
三元运算符引发Double类型NPE的原因分析
问题场景
以下String类型代码可正常运行:
String a = null; String b = a != null && a.equals("Nan") ? "Nan" : a; System.out.println(b);
但以下Double类型代码会抛出NullPointerException(NPE):
Double value = null; Double v = value != null && value.isNaN() ? 0.0 : value; System.out.println(v);
将其改写为if-else语句则可正常执行:
Double value = null; Double v; if (value != null && value.isNaN()) { v = 0.0; } else { v = value; }
差异原因
核心问题出在Java三元运算符的类型自动转换规则上:
- String场景:三元运算符的两个分支
"Nan"和a都是String类型(即使a是null),最终结果类型就是String,赋值给String类型变量b时,直接把null赋值过去,没有额外的类型转换操作,所以不会报错。 - Double场景:三元运算符的两个分支中,
0.0是double基本数据类型,value是Double包装类型。根据规则,三元运算符会把两个分支的结果统一为基本类型double——这意味着会对value执行自动拆箱操作,把Double包装类转成double基本类型。但此时value是null,拆箱时JVM无法从null中提取基本类型值,直接抛出NPE。 - if-else场景:if分支中
0.0会自动装箱为Double类型赋值给v,else分支直接把null的Double变量赋值给v,全程没有强制拆箱操作,因此不会触发NPE。
内容的提问来源于stack exchange,提问作者Vic Investa
相关产品推荐
相关产品推荐

