当三元运算符的两个分支类型不一致(如`double`字面量与`double`引用)时,jvm会将整个表达式提升为基本类型`double`,导致对`null`的`double`执行强制拆箱,从而抛出`nullpointerexception`。
这个问题本质上源于 Java 三元运算符(?:)的类型推断规则,而非逻辑短路失效或 isNaN() 方法本身的问题。
在以下代码中:
Double value = null; Double v = value != null && value.isNaN() ? 0.0 : value; // ❌ NPE!
虽然条件 value != null && value.isNaN() 本身是安全的(因短路特性,value.isNaN() 不会在 value == null 时执行),但问题出在表达式右侧的类型统一过程:

相比之下,String 示例能正常运行,是因为:
String a = null;
String b = a != null && a.equals("Nan") ? "Nan" : a; // ✅ 安全两个分支均为 String(引用类型),无需类型提升或拆箱,a 直接赋值给 b,null 被完整保留。
✅ 正确修复方式:确保三元表达式两侧类型一致(均为引用类型),通过显式类型转换避免隐式拆箱:
Double value = null; Double v = value != null && value.isNaN() ? (Double) 0.0 : value; // ✅ OK // 或使用 Double.valueOf(0.0) // 或更推荐:Double.ZERO(语义更清晰)
⚠️ 注意事项:
总结:三元运算符不是简单的语法糖,其类型推断机制可能引入隐蔽的拆箱风险。保持操作数类型一致、避免基本类型与包装类型混用,是写出健壮空安全代码的关键。