java三元表达式因自动拆箱导致的NPE问题

开发中发生的奇怪的问题,类似如下的代码NPE了。。。

boolean flag = false;
Integer a = null;
Integer n = flag ? 1 : a;

原来是在计算三元表达式结果时,a变量自动拆箱了。经 javap 反汇编发现,确实调用了Integer.intValue() 方法。

在三元表达式计算中,当第二、第三位操作数中有基本类型对象时,对象就会拆箱为基本类型进行操作。所以如果使用了基本类型或者隐式的使用了基本类型,需要考虑NPE问题。

  • 表达式中未使用基本类型,正常运行,n为null

    Integer a = null;
    Integer b = 1;
    Integer n = false ? b : a;
    
  • 表达式中隐式使用了基本类型,NPE

    Integer a = null;
    Integer b = 1;
    Integer c = 2;
    // b+c操作是将b和c变量自动拆箱后计算的
    Integer n = false ? b + c : a;
    
  • 表达式结果为基本类型,NPE。这个错误比较明显,虽然错误不是在三元表达式计算过程中出现的,但也应注意这种情况导致的NPE。

    Integer a = null;
    Integer b = 1;
    int n = false ? b : a;
    

如果业务逻辑中不能确保不出现null,还是用if...else...代替三元表达式吧。

下面的代码会NPE吗?

boolean flag = false;
int a = 1; // or Integer a = 1;
Integer n = flag ? a : null;

测试发现不会NPE,n的结果为null。这种情况不符合”第二、第三位操作数中有基本类型对象"这个条件,不会触发自动拆箱。

完结撒花✿✿ヽ(°▽°)ノ✿

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值