• 已删除用户
Administrator
发布于 2019-02-28 / 6 阅读
0

Java 三目运算符自动拆箱空指针异常分析

一、三目运算符

对于条件表达式b?x:y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。一个条件表达式从不会既计算x,又计算y。条件运算符是右结合的,也就是说,从右向左分组计算。例如,a?b:c?d:e将按a?b:(c?d:e)执行。

二、自动拆箱导致空指针

《阿里巴巴Java开发手册(泰山版)》新版新增了30+规约,提到在三目运算符使用过程中,需要注意自动拆箱导致的NullPointerException(后文简称:NPE)问题:

三、原理分析

关于为什么编辑器会在代码编译阶段对于三目运算符中的表达式进行自动拆箱,其实在《The Java Language Specification》(后文简称JLS)的第15.25章节中是有相关介绍的。

简单总结下,就是:当第二位和第三位表达式都是包装类型的时候,该表达式的结果才是该包装类型,否则,只要有一个表达式的类型是基本数据类型,则表达式得到的结果都是基本数据类型。如果结果不符合预期,那么编译器就会进行自动拆箱。(即Java开发手册中总结的:只要表达式1和表达式2的类型有一个是基本类型,就会做触发类型对齐的拆箱操作,只不过如果都是基本类型也就不需要拆箱了。)

规约示例中 Integer result = (flag ? a * b : c)a * b 两个包装类型之间进行四则运算会被自动拆箱成基本类型进行,并触发类型对齐 c 拆箱操作。c 为 null ,拆箱时导致NPE异常。

参考资料