我有以下代码:
Boolean bool = null;
try
{
if (bool)
{
//DoSomething
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
为什么我检查布尔变量“bool”会导致异常? 当它“看到”它不是真的时,它不应该跳过if语句吗? 当我删除if语句或检查它是否为null时,异常消失。
答案 0 :(得分:324)
如果您不喜欢额外的空检查:
if (Boolean.TRUE.equals(value)) {...}
答案 1 :(得分:143)
如果您有boolean
,则可以是true
或false
。然而,如果您有Boolean
,则可以Boolean.TRUE
,Boolean.FALSE
或null
作为任何其他对象。
在您的特定情况下,您的Boolean
为null
,而if
语句会触发隐式转换为生成boolean
的{{1}}。您可能需要:
NullPointerException
答案 2 :(得分:62)
(如果最高性能是项目中最重要的优先级,那么请查看本地解决方案的其他答案之一,这些解决方案不需要包含外部库。)
不要重新发明轮子。利用已经构建的内容并使用isTrue()
:
BooleanUtils.isTrue( bool );
检查Boolean
值是否为真,并通过返回null
来处理false
。
如果您不限于图书馆,那么您可以"允许"要包括,各种用例都有很多很棒的帮助函数,包括Booleans
和Strings
。我建议你仔细阅读各种Apache库,看看它们已经提供了什么。
答案 3 :(得分:12)
Boolean
类型可以是null
。您需要进行null
检查,因为您已将其设置为null
。
if (bool != null && bool)
{
//DoSomething
}
答案 4 :(得分:5)
Boolean是基本布尔值的对象包装类。这个类和任何类一样,确实可以为null。出于性能和内存的原因,最好使用原语。
Java API中的包装类有两个主要用途:
答案 5 :(得分:3)
或者借助Java 8 Optional的强大功能,您还可以执行以下操作:
Optional.ofNullable(boolValue).orElse(false)
:)
答案 6 :(得分:0)
当你的变量bool指向null时,你总是会得到一个NullPointerException,你需要先用一个非null值初始化变量,然后修改它。
答案 7 :(得分:0)
if (bool)
将被编译为 if (bool.booleanValue())
,如果 NPE
是 bool
,则会抛出 null
。
可空盒装布尔求值的其他解决方案:
JDK 9+
import static java.util.Objects.requireNonNullElse;
if (requireNonNullElse(bool, false)) {
// DoSomething
谷歌番石榴 18+
import static com.google.common.base.MoreObjects.firstNonNull;
if (firstNonNull(bool, false)) {
// DoSomething
false
用于此处的空情况。