标准条件语句与三元运算符处理Null的行为差异及NPE原因分析
为什么两个逻辑相似的方法一个返回null,另一个抛出NullPointerException?
核心原因:三元运算符的类型推断与自动拆箱
你的两个方法行为差异的根源在于Java三元运算符的类型统一规则,以及自动拆箱的触发时机不同:
1. process1的行为分析
当aggValue和nextValue都是null时,process1进入第一个if分支,直接返回nextValue——这里返回的是Long类型的null,没有任何拆箱操作,所以可以正常返回null。
2. process2的行为分析
process2使用了嵌套三元表达式:
return aggValue == null ? nextValue : nextValue == null ? aggValue : aggValue + nextValue;
Java编译器会对三元表达式做类型统一推断:
- 最后一个分支
aggValue + nextValue中,两个Long类型变量相加时会触发自动拆箱(转为long基本类型),因此这个分支的结果类型是long。 - 为了让整个三元表达式的类型统一,编译器会把整个表达式的结果类型推断为
long。 - 当第一个条件
aggValue == null为true时,需要把nextValue(Long类型的null)转为long类型,对null进行拆箱操作会直接抛出NullPointerException。
修复方案
如果要让process2和process1行为一致,需要强制指定表达式的返回类型为Long,避免自动拆箱:
return aggValue == null ? nextValue : nextValue == null ? aggValue : (Long) (aggValue + nextValue);
这样整个三元表达式的类型会被推断为Long,不会触发对null的拆箱操作,返回结果就会和process1一致。
内容的提问来源于stack exchange,提问作者rafaon
相关产品推荐
相关产品推荐

