Unboxing自动拆箱导致的NullPointerException空指针异常

祖传老代码发现了一个Integer自动拆箱导致的空指针异常,大致的代码如下:

if( StatusEnum.OK.getIndex() != order.getOrderStatus() ){
    //do something
}

在代码中,order是从数据库中查出来的,目前确保有值不会为null。!=前面的是个枚举值,也不可能为null。然而从日志的报错来看就是这一行导致了空指针异常,那么原因是啥呢?仔细看了下数据,发现原来是order中的orderStatus这个属性为null。从而导致了空指针。

也就是说,1!=null这种情况是会报空指针的而不是返回false。那么原因是啥呢?我们简单的写一段代码测试一下:

public class Test {

    public static void main(String[] args) {

        Integer n = null;
        Integer boxOne = 1;
        int unboxOne = 1;

        System.out.println(boxOne != n);
        System.out.println(unboxOne != n);

    }

}

执行结果:

我们可以看到。同样是使用!=且右边是一个null值,Integer类型不会报错,int类型报空指针了。原因是:当左边是Integer类型时,!=对比的是2个对象的内存地址引用是否一致;当左边是int类型是,!=对比的是值,这个时候会自动对右边的null进行拆箱操作,就在这个自动拆箱操作的时候发生了空指针异常


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍