编写的代码在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
。