先看一下下面这个Demo,猜猜能不能正常运行,为什么?
1 | class TestDTO{ |
恩,这个会抛出一个NPE
而换成if-else则会正常执行
1 | if (savedDTO == null){ |
为什么会是这样呢?
只能看一下字节码了
if-else的
三元运算符的
对比之下,会发现,三元运算符会多出来两条
Boolean.booleanValue和Boolean.valueOf
转化成伪代码
1 | Boolean.valueOf(savedDTO.getForceQuit().booleanValue) |
由于savedDTO.getForceQuit()获取的是null,所以就报NPE了
这不就是基本类型的装箱和拆箱吗!
如果想用三元运算符怎么解呢?
1 | testDTO.setForceQuit(savedDTO == null ? Boolean.FALSE : savedDTO.getForceQuit()); |
后记
虽然遇到这个问题,可以Google/Baidu找到答案,但是我们还是要能自己进行分析,定位问题,并找到背后的原因。毕竟学习JVM并不仅仅为了面试 :)