目录
什么是自动拆箱
拆箱:是将包装类型转换为基本数据类型
遇到的NPE问题
这里有一个简单的Person类,只有姓名和年龄的属性和get(),set()方法
public class Person {
String name;
Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
测试类
public class Main{
public static void main(String[] args) {
//正常情况
Person person1 = new Person();
person.age=10;
System.out.println(ifChilder(person1));
//非正常情况
Person person2 = new Person();
System.out.println(ifChilder(person2));
}
private static boolean ifChilder(Person person) {
if (person != null){
if (person.age < 16){
return true;
}
}
return false;
}
}
运行之后
true
Exception in thread "main" java.lang.NullPointerException
at Main.ifChilder(Main.java:17)
at Main.main(Main.java:12)
person1对象没有发生异常,但是person2对象发生了异常
首先我们先排除person2对象为空的异常,因为在ifChildern()方法中,我们判断了person2是否为空,也就是说,出现问题的是这一行代码
if (person.age < 16){
return true;
}
追溯到前面也就是,这一行代码有异常
System.out.println(ifChilder(person2));
问题原因
因为自动拆箱调用的是XXXValue()方法,在源码中
public int intValue() {
return value;
}
返回的是包装类对象的值,但是person2我们没有给他的age赋值,所以发生了NPE
总结
自动拆箱时由于调用的是intValue方法,所以如果调用方本身是null的话,肯定会NPE。我们需要在测试的时候可以咋自动拆箱的地方进行判断,来避免NPE