You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三元运算符引发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:50:27