Double.isNaN()仅检测值是否为NaN,对正常数字、正负无穷、±0.0均返回false;需配合Double.isInfinite()判断有效数值,并注意Double包装类的null安全。

Double.isNaN() 的作用很明确:只检测值是不是 NaN,不是“判断是否为数值”的通用工具。
它只对 NaN 返回 true,其余都返回 false
包括正常数字(1.0、-3.14)、正无穷(Double.POSITIVE_INFINITY)、负无穷(Double.NEGATIVE_INFINITY),甚至 -0.0 和 0.0,调用 Double.isNaN() 都返回 false。只有真正意义上的 NaN 值——比如 0.0 / 0.0、Math.sqrt(-1.0)、Double.NaN + 1 等结果——才会触发 true。
想确认“是不是有效数值”,不能单靠 isNaN()
很多业务场景中,无穷大同样不可接受(例如坐标、价格、时间戳)。这时仅检查 NaN 是不够的:
- 用
Double.isNaN(x)排除非数字 - 用
Double.isInfinite(x)排除正负无穷 - 常见组合写法:
!Double.isNaN(x) && !Double.isInfinite(x)
注意 null 和包装类型的安全调用
Double.isNaN() 的参数是基本类型 double,不接受 null。如果变量是 Double 包装类,直接传入会因自动拆箱抛出 NullPointerException:
- 错误写法:
Double value = null; Double.isNaN(value); - 正确写法:
value != null && !Double.isNaN(value)(JDK 1.8+ 支持重载的Double.isNaN(Double),但 null 仍需前置判空)
别把它当异常捕获机制
Double.isNaN() 是事后检查,不是运行时拦截。浮点运算(如除零)本身不会抛异常,而是静默生成 Infinity 或 NaN。它无法发现 NullPointerException、字符串解析失败等其他问题,也不能替代 try-catch 或 Double.parseDouble() 的校验逻辑。










