在Java中,你通常会说
if(someBool != false)
与
相同 if(someBool)
但是,如果someBool
不是boolean
类型而是Boolean
,并且其值为null
,该怎么办?
答案 0 :(得分:112)
如果你想处理Boolean
个实例以及基元并且是空的,那么你可以使用它:
if(Boolean.TRUE.equals(someBool))
答案 1 :(得分:48)
它将抛出NullPointerException
(null
null
投掷NPE。
但这仅表示您不得允许null
值。使用默认值,或者不使用自动装箱并进行非空检查。因为使用布尔值的{{1}}意味着您有3个而不是2个值。 (Michael和Tobiask提出了更好的处理方式)
答案 2 :(得分:21)
使用ApacheCommons BooleanUtils.isTrue()或.isFalse()
答案 3 :(得分:3)
如果someBool
是Boolean
if (someBull != null && someBull) {
//Yeah, true.
}
由于布尔值可以是null
,因此请确保通过检查非空来避免NullPointerException
。
答案 4 :(得分: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");
答案 5 :(得分:2)
但是,您可以将null布尔值与布尔实例进行比较。例如:
Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);
打印:
false
false
答案 6 :(得分:0)
原始布尔&对象布尔。前者只能是 true 或 false 。后者可以是 true , false 或 unknown / undefined 。 (即null)。您使用哪种方法取决于您是要处理两个用例还是三个用例。
答案 7 :(得分:0)
它已经过时了,但Boolean.valueOf(null)
为false
,就像Boolean.valueOf(false)
false
一样。
答案 8 :(得分: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>
答案 9 :(得分:0)
如果是Java 7+,您可以使用
import java.util.Objects;
和
if (Objects.equals(someBool, true))
答案 10 :(得分:-1)
由于布尔将为您提供一个对象,因此在处理对象
之前必须始终检查NULL答案 11 :(得分:-2)
如果为null,则会出现NullPointerException