三目运算符自动类型转换问题

问题定位

灰发期间发现代码抛出了空指针,那么看一下抛出空指针处的异常代码

Double coefficient = dto == null ? 0.8 : dto.getCoefficient();

想破脑袋也没有想出来问题原因。于是线上代码下载下来反编译核对一下,发现了问题原因

Double coefficient = Double.valueOf(dto == null ? 0.8D : dto.getCoefficient().doubleValue());

可以看到三目运算符有一个类型统一的隐式转换,这行代码的空指针点有可能是getCoefficient方法返回的属性为空。那么我们去看下这个类的这个属性

@Data
@Builder
public class DTO {
    private Double coefficient = 0.8;
}

有默认值,不会为空的应该,为什么会空指针呢?我们再根据异常堆栈定位到具体代码写法是使用Builder创建的,那么是不是跟这个有关系,于是我们测试发现确实Builder创建的对象我们配置的默认值是没有生效的

问题总结

  1. 通过lombok的Builder创建的对象,原对象中的默认值是不生效的
  2. 三目运算符,test ? true : false,true分支代码的数据类型与false分支代码的数据类型如果不一致,会隐式的按照true分支代码处的数据类型进行统一转换。例如:Double d = dto == null ? 0.8D : dto.getD()。getD()返回的是BigDecimal类型,但是0.8D是Double类型,所以会将getD返回的类型隐式转换,转换期间因为getD返回的是NULL,因此会抛出NPE异常
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值