三目运算符自动解包问题

问题定位

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

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()返回了包装类型,但是因为0.8D是拆包的类型,所以会将getD返回的包装类型隐式的拆包
发布了81 篇原创文章 · 获赞 85 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u010597819/article/details/99463594