JAVA中的Boolean对象和布尔变量问题

时间:2012-02-28 09:57:12

标签: java

我宣布一个布尔变量。例如Boolean dataVal=null;
现在,如果我执行以下代码段:

if(dataVal)
    System.out.println("\n\NULL value in dataVal: "+dataVal);
else
    System.out.println("\n\nvalue in dataVal: "+dataVal);

我得到NullPointerException。嗯,我知道这很明显,但我需要知道背后的原因。

5 个答案:

答案 0 :(得分:32)

当您评估Boolean对象的布尔值时,Java取消装箱值(自动装箱功能,自1.5起)。所以真正的代码是:dataVal.booleanValue()。然后它抛出NullPointerException。对于任何装箱值,取消装箱空对象会抛出此异常。

在1.5之前你必须手动取消装箱值:if (dataVal.booleanValue())所以它更明显(更详细):

答案 1 :(得分:14)

因为使用dataValboolean转换为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.