工作记录------方法调用与三目运算符引发的BUG(add结果反而为0?)

工作记录------三目运算符引发的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)));

输出结果就如预期结果过了
具体的原因是:

方法调用的优先级要大于运算符的优先级,这个在for循环中,判断数组长度时亦能够体现,只是自己当时没有认真思考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值