Java自动拆箱的NullPointerException陷阱

363 阅读1分钟

前言

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。

规避方法

变量类型定义保持统一。