为何Java在三元运算符进入else分支时会调用Integer.intValue()?
三元运算符触发空指针异常的原因解析
问题场景
- 当传入的
seed大于4000时,程序直接返回该值;但当seed小于等于4000时,进入三元运算符的else分支会抛出空指针异常。 - 若将
getRankFromMain方法的参数seed声明为Integer类型,程序即可正常运行。
示例代码
public class TestSomething { private static Integer getRank() { return null; } private static Integer getRankFromMain(int seed) { return seed > 4000 ? seed : getRank(); } public static void main(String[] args) { Integer rank = getRankFromMain(1000); System.out.println(rank); } }
原因解析
Java的三元运算符要求两个分支的结果必须统一为同一类型,否则会触发自动类型转换:
- 当
seed是int基本类型时,三元运算符的第一个分支返回int,第二个分支返回的Integer包装类型会被自动拆箱为int类型来匹配前者,这个拆箱过程会调用Integer.intValue()方法。 - 但
getRank()返回的是null,对null的Integer对象调用intValue()会直接抛出空指针异常。
如果把参数seed改为Integer类型,第一个分支的结果是Integer包装类型,和第二个分支的返回类型一致,不需要拆箱操作,返回null后可以正常赋值给Integer rank,最终打印null。
内容的提问来源于stack exchange,提问作者Santosh Bobade
相关产品推荐
相关产品推荐

