三元表达式中的空指针问题


如今已经渐渐习惯了使用三元表达式来代替if else,确实代码更加的简洁明了,但在使用中稍微不慎也会出现空指针异常(NPE)

一、异常重现

这是很多人不知道的一个场景,小杨也是一次线上血淋淋的 Bug 发生后,才了解到的一种案例。看一个简单的三元表达式的代码:

@Test
public void test(){
    boolean flag = true;
    Integer i = null;
    int j = 1;
    int k = flag ? i : j;
}

错误重现

二、异常解释

int k = flag ? i : j; 这行,会发生自动拆箱,此时由于i是空,所以在拆箱时会出现空指针。我们可以反编译下这段代码

@Test
public void test(){
  boolean flag = true;
  Integer i = Integer.valueOf(0);
  int j = 1;
  int k = flag ? i.intValue() : j;
}

这其实是三元表达式的语法规范,当第二,第三位操作数分别为基本类型和对象时,其中的对象就会拆箱为基本类型进行操作。

因为例子中,flag ? i : j; 片段中,第二段的i是一个包装类型的对象,而第三段的j是一个基本类型,所以会对包装类进行自动拆箱。如果这个时候i的值为 null,那么就会发生 NPE。

三、补充

@Test
public void test(){
   boolean flag = true;
   Integer i = null;
   Integer j = null;
   int k = flag ? i : j;
}

本例子中的第二、第三操作符都是封装类型,但是在运行时,仍然会出现空指针问题,这是由于接受参数类型为int类型。也会自动发送自动拆箱。


  目录