35

在 Java 中,你通常会这样说

if(someBool != false)

是相同的

if(someBool)

但是如果someBool不是类型boolean但是 Boolean,并且它的值是,null怎么办?

4

12 回答 12

125

如果您想处理Boolean实例和原语并且是空安全的,您可以使用它:

if(Boolean.TRUE.equals(someBool))
于 2010-11-30T12:08:54.010 回答
51

它将抛出一个NullPointerException(抛出 NPE的自动拆箱)。null

但这仅意味着您不能允许null值。要么使用默认值,要么不使用自动拆箱并进行非空检查。因为使用null布尔值意味着您有 3 个值,而不是 2 个值。(Michael 和 Tobiask 提出了更好的处理方法)

于 2010-11-30T12:08:07.387 回答
21

使用 ApacheCommons BooleanUtils.isTrue() 或 .isFalse()

于 2010-11-30T12:06:09.610 回答
3

如果someBoolBoolean

if (someBull != null && someBull) {
  //Yeah, true.
}

由于布尔值可以null确保您NullPointerException通过检查不为空来避免。

于 2010-11-30T12:10:07.797 回答
3

我做了一个小测试:

    Boolean o = null;
    try {
        System.out.println(o ? "yes" : "no");
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        System.out.println((o != false) ? "yes" : "no");
    } catch (Exception e) {
        e.printStackTrace();
    }

输出令人惊讶:

java.lang.NullPointerException
    at btest.main(btest.java:10)
java.lang.NullPointerException
    at btest.main(btest.java:15)

第一个 NPE 是意料之中的,因为 o 将被自动拆箱(并且由于它为空而失败)。第二次发生的原因相同,但感觉不自然。无论如何,解决方案是:

System.out.println(!Boolean.FALSE.equals(o) ? "yes" : "no");
于 2010-11-30T12:10:58.473 回答
2

但是,您可以将 null Boolean 与 Boolean 实例进行比较。例如 :

Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);

印刷 :

false
false
于 2013-05-27T08:51:18.097 回答
0

很好地说明了原始boolean和对象Boolean之间的区别。前者只能是truefalse。后者可以是truefalseunknown/undefined。(即,空)。您使用哪个取决于您是要处理两个用例还是三个用例。

于 2010-12-01T16:54:16.307 回答
0

它很旧,但是就像Boolean.valueOf(null)is一样。falseBoolean.valueOf(false)false

于 2017-08-08T18:13:06.540 回答
0

实际上,布尔构造函数接受 null,返回 FALSE 并且不抛出 NullPointerTantrum。

 new Boolean(null);
 <false>

这还有一个额外的好处,那就是对字符串给出一个真实的响应,但"true"情况并非如此,Boolean.TRUE.equals但我们再次受到更多限制,只有字符串和布尔值的构造函数。

您可以通过字符串连接来克服一些问题,这也是防空的。

 new Boolean(""+null);
 <false>

 new Boolean(""+false);
 <false>

 new Boolean(""+new Object());
 <false>

 new Boolean(""+6);
 <false>

 new Boolean(""+new Integer(9));
 <false>

确保 Java 中可用的所有 TRUE 选项仍然存在。

 new Boolean(""+true);
 <true>

 new Boolean(""+"true");
 <true>
于 2017-09-02T00:39:59.557 回答
0

如果是 Java 7+,您可以使用

import java.util.Objects;

if (Objects.equals(someBool, true))
于 2018-04-27T21:58:09.577 回答
-1

由于布尔值会给您一个对象,因此您必须始终在处理该对象之前检查 NULL

于 2010-11-30T12:08:11.203 回答
-2

如果它为空,那么你会得到一个 NullPointerException

于 2010-11-30T12:10:15.577 回答