Stay hungry, Stay foolish

0%

Java三元运算符与NPE

先看一下下面这个Demo,猜猜能不能正常运行,为什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class TestDTO{
private Boolean isForceQuit;

public Boolean getForceQuit() {
return isForceQuit;
}

public void setForceQuit(Boolean forceQuit) {
isForceQuit = forceQuit;
}
}

public class Test {

public static void main(String[] args) {
TestDTO testDTO = new TestDTO();
TestDTO savedDTO = new TestDTO();
testDTO.setForceQuit(savedDTO == null ? false : savedDTO.getForceQuit());
}
}

恩,这个会抛出一个NPE

而换成if-else则会正常执行

1
2
3
4
5
if (savedDTO == null){
testDTO.setForceQuit(false);
} else {
testDTO.setForceQuit(savedDTO.getForceQuit());
}

为什么会是这样呢?

只能看一下字节码了

if-else的

三元运算符的

对比之下,会发现,三元运算符会多出来两条

Boolean.booleanValueBoolean.valueOf

转化成伪代码

1
Boolean.valueOf(savedDTO.getForceQuit().booleanValue)

由于savedDTO.getForceQuit()获取的是null,所以就报NPE了

这不就是基本类型的装箱和拆箱吗!

如果想用三元运算符怎么解呢?

1
testDTO.setForceQuit(savedDTO == null ? Boolean.FALSE : savedDTO.getForceQuit());

后记

虽然遇到这个问题,可以Google/Baidu找到答案,但是我们还是要能自己进行分析,定位问题,并找到背后的原因。毕竟学习JVM并不仅仅为了面试 :)

据说打赏我的人,代码没有BUG