我声明了一个布尔变量,例如: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 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 会解包该值(自动装箱特性,自1.5版本开始)。因此,真正的代码是: dataVal.booleanValue()
。然后它抛出 NullPointerException
异常。对于任何装箱的值,如果解包一个空对象则会抛出此异常。
在1.5版本之前,你必须手动解包该值:if (dataVal.booleanValue())
,因此这更加明显(同时也更冗长:)
Boolean.booleanValue()
将dataVal
强制转换成boolean
,进而被翻译成null.booleanValue()
,这导致了一个空指针异常。if(null)
。final Boolean booleanTest = new Boolean (true);
if (booleanTest) {
// Do something
}
Boolean(类)!= boolean(原始类型)。
Java尝试通过调用dataVal.booleanValue()来获取原始值。由于dataVal为null,因此会出现空指针异常。
当您尝试评估布尔对象值时,JVM会在该对象上内部调用booleanValue()方法。如果您将null赋值给该对象,则会抛出NullPointerException异常。
if(null)
不是一个有效的表达式,就这么简单。
在底层,虚拟机正在使用自动装箱... 所以你会得到一个 NullPointerException。
Boolean
是一个对象,而不是原始值,因此null是合理的。 - mcfinnigan