自动拆箱时遇到的NPE问题

目录

什么是自动拆箱

遇到的NPE问题

问题原因

总结

什么是自动拆箱

拆箱:是将包装类型转换为基本数据类型

遇到的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值