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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:30:15