我宣布一个布尔变量。例如Boolean dataVal=null;
现在,如果我执行以下代码段:
if(dataVal)
System.out.println("\n\NULL value in dataVal: "+dataVal);
else
System.out.println("\n\nvalue in dataVal: "+dataVal);
我得到NullPointerException
。嗯,我知道这很明显,但我需要知道背后的原因。
答案 0 :(得分:32)
当您评估Boolean
对象的布尔值时,Java取消装箱值(自动装箱功能,自1.5起)。所以真正的代码是:dataVal.booleanValue()
。然后它抛出NullPointerException
。对于任何装箱值,取消装箱空对象会抛出此异常。
在1.5之前你必须手动取消装箱值:if (dataVal.booleanValue())
所以它更明显(更详细):
答案 1 :(得分:14)
因为使用dataVal
将boolean
转换为Boolean.booleanValue()
,null.booleanValue()
会转换为{{1}},导致您出现NullPointerException。
答案 2 :(得分:5)
您可以查看解除收箱问题的规范,您的情况已经描述here部分 5.1.8拆箱转换:如果r为空,则取消装箱转换将引发NullPointerException
这意味着你的if(/ * Boolean对象* /)永远不会被拆箱成布尔基元类型,因此抛出一个NPE因为你做了一个无效的if(null)
。
顺便说一句,如果您有以下内容,拆箱将会有效:
final Boolean booleanTest = new Boolean (true);
if (booleanTest) {
// Do something
}
答案 3 :(得分:1)
Boolean(class)!= boolean(primitive type)。
Java尝试获取调用dataVal.booleanValue()的原始值。因为dataVal为null,所以会得到空指针异常。
答案 4 :(得分:0)
if(null)
不是一个有效的表达式,就像那样简单。
在引擎盖下,VM正在使用自动装箱......所以你得到NullPointerException.