问题定位
灰发期间发现代码抛出了空指针,那么看一下抛出空指针处的异常代码
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创建的对象我们配置的默认值是没有生效的
问题总结
- 通过lombok的Builder创建的对象,原对象中的默认值是不生效的
- 三目运算符,test ? true : false,true分支代码的数据类型与false分支代码的数据类型如果不一致,会隐式的按照true分支代码处的数据类型进行统一转换。例如:Double d = dto == null ? 0.8D : dto.getD()。虽然getD()返回了包装类型,但是因为0.8D是拆包的类型,所以会将getD返回的包装类型隐式的拆包