Java 布尔值!=假的

Java 布尔值!=假的,java,boolean,autoboxing,Java,Boolean,Autoboxing,在Java中,您通常会这样说 if(someBool!=false) 与 if(someBool) 但是如果someBool不是boolean类型,而是boolean,并且它的值是null?使用ApacheCommons BooleanUtils.isTrue()或.isFalse(),它将抛出NullPointerException(ofnull抛出NPE) 但这只意味着您不能允许null值。使用默认值,或者不使用自动取消装箱并进行非空检查。因为使用布尔值的null表示有3个值,而不是2个值。

在Java中,您通常会这样说

if(someBool!=false)

if(someBool)


但是如果
someBool
不是
boolean
类型,而是
boolean
,并且它的值是
null

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

,它将抛出
NullPointerException
(of
null
抛出NPE)


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

由于Boolean将为您提供一个对象,您必须在处理该对象之前始终检查NULL

如果您希望处理
Boolean
实例以及基元,并且是空安全的,您可以使用以下方法:

if(Boolean.TRUE.equals(someBool))

如果
someBool
Boolean

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

由于布尔值可以为
null
请确保通过检查NOTNULL来避免
NullPointerException

如果它为null,则会得到NullPointerException

我做了一个小测试:

    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");

很好地说明了基本体布尔值与对象布尔值之间的差异。前者只能是。后者可以是、或未知/未定义。(即,空)。您使用哪一个取决于您是要处理两个用例还是三个用例。

但是,您可以将空布尔值与布尔值实例进行比较。例如:

Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);
印刷品:

false
false

它很旧,但是
Boolean.valueOf(null)
false
,就像
Boolean.valueOf(false)
false

实际上,布尔构造函数接受null,返回false,并且不抛出null指针

 new Boolean(null);
 <false>
确保java中所有可用的真正选项仍然保留

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

 new Boolean(""+"true");
 <true>
新布尔值(“+true”);
新布尔值(“+”真”);

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

import java.util.Objects;


或者,如果您想在someBool同时为
null
时执行某些操作,
!Boolean.FALSE.equals(someBool)
@Bart
Boolean.FALSE.equals(null)
将返回
FALSE
-您的语句与Michael的答案完全相同。@Jesper:no<代码>!Boolean.FALSE.equals(null)
返回
true
,而
Boolean.true.equals(null)
返回
FALSE
。然而,这很好地证明了双重否定很难在精神上解析,因此可以更好地避免。如果doFoo为true而foo未完成,或者doFoo为false而foo已完成,则会引发错误。如果doFoo为null,则不会引发任何错误regardless@Michael,@Bart Argh,你说得对,我甚至试过了,但在试的时候犯了一个错误。。。抱歉。你为什么不自己试试呢?@Jesper:我试过了,下面是我自己的答案。幸运的是,还有其他一些原因需要使用布尔值,例如将值存储在一组对象中。在这种情况下,无论您是否需要,您都必须处理这三个用例。如果我使用new创建一个Boolean,这将不起作用,它将只在使用并且可能使用自动装箱时起作用
assertThat(new Boolean(true)==Boolean.true,is(true))这项测试没有通过…@stivlo:我认为布尔(以及所有表示对象的原语)应该是某种形式的池,并被认为是相等的。谢谢你的评论,我今天学到了一些东西。使用
Boolean.TRUE.equals(myBool)
Boolean.FALSE.equals(myBool)
来代替。你可以通过说
Boolean.TRUE.equals(o)
@ChrisParton不,你实际上不能。请参阅Michael Borgwardt对空案例中差异的回答的评论。这是一个很好的方法。ApacheComons库使Java编程成为一种乐趣。浏览lang3中的代码,这确实是
Boolean.TRUE.equals(…)
,等等。个人认为第三方dep.@Xenotheracide不值得,如果你只是想避免
Boolean.TRUE.equals(myValue)
但是,如果您已经在使用Apache Commons库进行其他工作,那么为什么不进一步利用它呢?
import java.util.Objects;
if (Objects.equals(someBool, true))