前言
Java的自动装箱、自动拆箱功能相信大家都已知道。但如果变量类型定义不规范,可能会在自动拆箱过程中遇到NullPointerException。
实战讲解
在BO/DTO/VO等对象中,我们一般是定义封装类(下文代码以Double和double为例)。
如有个StudentBO类定义如下:
public class StudentBO {
private String name;
private String studentNo;
private Double score;
// getter setter
}
使用过程:
// student:{"studentNo":"001","name":"张三"}
double score = student.getScore(); // throw NullPointerException
// 对score的其他操作逻辑
原因分析
首先明白了自动装箱、自动拆箱的原理,也就知道如何规避隐患。
自动装箱、自动拆箱原理
由反编译的结果可知,装箱的时候调用的是Double.valueOf()方法,拆箱时调用的是Double实例的doubleValue()。
其他的包装器类也类似,这里就不一一举例了。
总结:java装箱过程是调用包装类的静态方法valueOf()实现的,而拆箱过程则是调用包装类的实例方法xxxValue()实现的(xxx代表对应的基本类型)
自动拆箱NullPointerException
因为自动拆箱是调用实例方法,需要先实例化。若调用时未实例化,会抛出NullPointerException。
规避方法
变量类型定义保持统一。