最近在项目中使用三目运算时候,出现了一个意想不到的问题,特与大家分享一下。

java中的三目运算符是(Java三目运算你真的了解透了么)(1)

经常在写代码中会遇到一些if-else判断,比如以下代码:

java中的三目运算符是(Java三目运算你真的了解透了么)(2)

这样写显然不够优雅,代码看起来很是臃肿,要是判断很多,代码就会非常混乱,三目运算虽然不能百分百代替if-else ,适当的使用会使你的代码变得很简洁,比如以上代码这样写:

java中的三目运算符是(Java三目运算你真的了解透了么)(3)

这中方式用了很多次,从没出现过错误,但是最近项目中使用时候报了空指针,

boolean flag=false;

都是jvm指令 关键就是第13条指令,把上述命令精简以下就是

Integer numA1 = Integer.valueOf(flag? 1 : b.intValue());

要是理解java一些基本类型的拆箱和装箱,你应该就懂了,这里在取b的时候进行了一次拆箱,变成基本类型了。为何这里进行拆箱操作呢。我们来换一种写法:

java中的三目运算符是(Java三目运算你真的了解透了么)(4)

这种写法居然没报错,也就是其是否拆箱为基本类型,和待选结果类型有关呢?

翻了下JDK说明文档对三目运算进行了以下描述.。当第二和第三目为基本类型和对象情况时,其中的对象在被命中后会进行拆箱操作。

总结以下就是上述运算中1为基本类型,b为int对象,第二、第三位操作数分别是基本类型和对象。所以对对象进行拆箱操作,由于该对象为null,所以在拆箱过程中调用null.initValue()的时候就报了空指针。

,