在 Java 中,你通常会这样说
if(someBool != false)
是相同的
if(someBool)
但是如果someBool
不是类型boolean
但是 Boolean
,并且它的值是,null
怎么办?
在 Java 中,你通常会这样说
if(someBool != false)
是相同的
if(someBool)
但是如果someBool
不是类型boolean
但是 Boolean
,并且它的值是,null
怎么办?
如果您想处理Boolean
实例和原语并且是空安全的,您可以使用它:
if(Boolean.TRUE.equals(someBool))
它将抛出一个NullPointerException
(抛出 NPE的自动拆箱)。null
但这仅意味着您不能允许null
值。要么使用默认值,要么不使用自动拆箱并进行非空检查。因为使用null
布尔值意味着您有 3 个值,而不是 2 个值。(Michael 和 Tobiask 提出了更好的处理方法)
使用 ApacheCommons BooleanUtils.isTrue() 或 .isFalse()
如果someBool
是Boolean
if (someBull != null && someBull) {
//Yeah, true.
}
由于布尔值可以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");
但是,您可以将 null Boolean 与 Boolean 实例进行比较。例如 :
Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);
印刷 :
false
false
很好地说明了原始boolean和对象Boolean之间的区别。前者只能是true或false。后者可以是true、false或unknown/undefined。(即,空)。您使用哪个取决于您是要处理两个用例还是三个用例。
它很旧,但是就像Boolean.valueOf(null)
is一样。false
Boolean.valueOf(false)
false
实际上,布尔构造函数接受 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>
如果是 Java 7+,您可以使用
import java.util.Objects;
和
if (Objects.equals(someBool, true))
由于布尔值会给您一个对象,因此您必须始终在处理该对象之前检查 NULL
如果它为空,那么你会得到一个 NullPointerException