工作记录------三目运算符引发的BUG
背景:发现一个对象的几个属性值相加,结果为0,而其中几个属性是有值的,其他几个属性是没有值的。
其中用到了三目运算符对属性值进行判空。
具体实现是,先对属性进行判断,如果是空,就取0,如果不是空,就取这个值本身。
复现示例代码:
@Test
public void testMap3(){
KDTO kDTO = new KDTO();
kDTO.setCount_6(new BigDecimal(16));
System.out.println(kDTO.getCount_1() == null);
System.out.println(kDTO.getCount_1() == null ? BigDecimal.ZERO:kDTO.getCount_1());
System.out.println(BigDecimal.ZERO.add(new BigDecimal(7)));
System.out.println(kDTO.getCount_1() == null ? BigDecimal.ZERO:kDTO.getCount_1().add(new BigDecimal(7)));
}
期待输出结果
true
0
7
7
但是、竟然输出结果为
true
0
7
0
问题就在这行代码中,
我的想法是:Count_1为null,就取0,0再加上7.
结果就应该是7.
System.out.println(kDTO.getCount_1() == null ? BigDecimal.ZERO:kDTO.getCount_1().add(new BigDecimal(7)));
经过屡次、反复尝试,始终没找到问题,
最后只能逐字逐句看,灵光一闪,发现了问题所在
这部分并没有问题
kDTO.getCount_1() == null ? BigDecimal.ZERO:kDTO.getCount_1()
这部分也没有问题
.add(new BigDecimal(7)
问题在合在一起。
执行顺序
执行顺序并没有自己的逻辑。
而是先 1+(2+3),而不是(1+2)+3
也就是
kDTO.getCount_1() 为null时,取得并不是BigDecimal.ZERO然后再add(new BigDecimal(7)
而直接是
BigDecimal.ZERO,因为
kDTO.getCount_1().add(new BigDecimal(7)) 是一体的。
当我增加括号修改后:
System.out.println((kDTO.getCount_1() == null ? BigDecimal.ZERO:kDTO.getCount_1()).add(new BigDecimal(7)));
输出结果就如预期结果过了
具体的原因是: