JAVA中的Boolean对象和boolean变量问题

27

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

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

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


1
什么是 Reason?它是 null,因此会出现 nullpointerException 的原因。 - Samir Mangroliya
布尔值=null; 这不是正确的Java语法,对吧? - Russell
4
@Russell - Boolean 是一个对象,而不是原始值,因此null是合理的。 - mcfinnigan
7个回答

40

当你评估一个 Boolean 对象的布尔值时,Java 会解包该值(自动装箱特性,自1.5版本开始)。因此,真正的代码是: dataVal.booleanValue()。然后它抛出 NullPointerException 异常。对于任何装箱的值,如果解包一个空对象则会抛出此异常。

在1.5版本之前,你必须手动解包该值:if (dataVal.booleanValue()),因此这更加明显(同时也更冗长:)


16
因为使用了Boolean.booleanValue()dataVal强制转换成boolean,进而被翻译成null.booleanValue(),这导致了一个空指针异常。

5
您可以查看拆箱问题的规范,您的情况在此描述:这里5.1.8拆箱转换部分:如果r为null,则拆箱转换会抛出NullPointerException 这意味着您的if ( /* Boolean object */ )永远不会被拆箱成布尔原始类型,因此会抛出NPE,因为您正在执行无效的if(null)
顺便说一下,如果您有以下代码,则拆箱将起作用:
final Boolean booleanTest = new Boolean (true);
if (booleanTest) {
    // Do something
}

1

Boolean(类)!= boolean(原始类型)。

Java尝试通过调用dataVal.booleanValue()来获取原始值。由于dataVal为null,因此会出现空指针异常。


0

当您尝试评估布尔对象值时,JVM会在该对象上内部调用booleanValue()方法。如果您将null赋值给该对象,则会抛出NullPointerException异常。


0

if(null) 不是一个有效的表达式,就这么简单。

在底层,虚拟机正在使用自动装箱... 所以你会得到一个 NullPointerException。


0
使用BooleanUtils.tobolean(?),如果传递的参数为null,则返回false。

这完全没有回答问题 - 为什么会出现NPE。你回答了如何预防它的问题,但OP并没有问这个。 - cyberbrain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接