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

Java三元运算符触发NullPointerException的原因及代码差异解析

为什么这段三元运算符代码会抛出NullPointerException?

这个问题的根源在于Java三元运算符的类型统一规则,我来给你一步步拆解清楚:

先看抛出异常的代码

Object obj = null; Long lNull = null; Long res = obj == null ? lNull : 10L;

这里三元表达式的两个分支分别是:

  • 左分支:Long类型的变量lNull(值为null)
  • 右分支:long基本类型的字面量10L

根据Java的语法规则,三元运算符会自动将两个分支的类型统一。当一个分支是包装类型(Long)、另一个是对应的基本类型(long)时,编译器会选择基本类型作为表达式的结果类型,这就意味着左分支的Long对象会被自动拆箱成long。

当obj == null成立时,我们要返回lNull(也就是null),这时候Java尝试把Long类型的null拆箱成long基本类型——这必然会抛出NullPointerException,因为null无法被拆箱为任何基本类型的值。

再看正常运行的代码

Object obj = null; Long res = obj == null ? null : 10L;

这里的左分支是直接写的null,编译器会根据上下文(要赋值给Long类型变量)自动推断这个null的类型为Long。同时右分支的10L会被自动装箱成Long类型,所以整个三元表达式的结果类型是Long。

这时候返回null完全符合Long类型的要求,不需要任何拆箱操作,自然也就不会触发空指针异常了。

核心总结

  • 三元运算符会优先将分支类型统一为基本类型(触发包装类拆箱),如果拆箱的对象是null,就会抛出NPE
  • 当分支直接用null时,编译器会根据赋值目标的包装类型来统一类型,避免了拆箱操作

内容的提问来源于stack exchange,提问作者Pavel Kataykin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:26:50