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