如今已经渐渐习惯了使用三元表达式来代替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
类型。也会自动发送自动拆箱。