Java -运算符+引起的NullPointerException

编写的代码在uat运行,发现发生NPE。经检查,确定是运算符+引起的,这让我匪夷所思,但接下来的代码验证了我的猜想:

/**
 * @author Virgil.Wang
 */
public class AddSymbolTest {

    public static void main(String[] args) {
        Integer m = 10;
        Integer n = null;
        System.out.println(m);
        System.out.println(n);
        System.out.println(m + n);
    }

}

输出结果

10
null
Exception in thread "main" java.lang.NullPointerException
	at edu.virigl.other.AddSymbolTest.main(AddSymbolTest.java:13)

Process finished with exit code 1

结论,在进行包装类型,如Integer,Long等保障类型想加时,除了保证对象非空外,还要保证对象中的包装类型的属性不能为空。推荐做法如下:

    public static void main(String[] args) {
        Integer m = 10;
        Integer n = null;
        System.out.println(m);
        System.out.println(n);
        // FIXME 修改后的做法
        System.out.println((m == null ? 0 : m) + (n == null ? 0 : n));
    }
原因分析

Java在运算时,应该是以基本数据类型进行运算操作的(未找到相关的文档说明)。在两个Integer对象想加时,虚拟机隐式的调用Integer#intValue()Integer对象转向转换为int类型。当Integer对象为空时,intValue()会抛出NullPointerException

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值