我有以下代码:

Boolean bool = null;

try 
{
    if (bool)
    {
        //DoSomething
    }                   
} 
catch (Exception e) 
{
    System.out.println(e.getMessage());             
}

为什么我对布尔变量“bool”的检查导致异常? 当它“看到”它不是真的时,它不应该直接跳过if语句吗? 当我删除if语句或检查它是否为非空时,异常消失了。


当前回答

如果你不喜欢额外的空检查:

if (Boolean.TRUE.equals(value)) {...}

其他回答

Objects.equals ()

K-ballo的回答没有问题。如果你喜欢一个简单的条件,像我一样,你不喜欢尤达条件,因为java 1.7的答案是

    if (Objects.equals(bool, true)) {

或者与此同时,如果你更愿意明确一点

    if (Objects.equals(bool, Boolean.TRUE)) {

或者更好的做法是:避免这个问题

不建议使用布尔对象,从而允许布尔引用首先为空。像你看到的NullPointerException的风险太大了。如果您需要一种三状态逻辑,那么最好定义一个包含三个值的enum。例如

enum MyTristateBoolean { FALSE, DONT_KNOW, TRUE }

现在我们根本不需要null。中间的常数可能应该命名为UNKNOWN, UNDEFINED, NOT_EXISTING或其他什么,这取决于你的确切情况。如果合适,您甚至可以将其命名为NULL。现在,根据你的口味,你的比较变成了以下两种。

    if (myBool.equals(MyTristateBoolean.TRUE)) {

    if (myBool == MyTristateBoolean.TRUE) {

后者可以工作,因为编译器保证每个枚举常量只有一个实例。正如你们大多数人所知道的,==对于比较非enum类型的相等对象不起作用。

当你的变量bool指向null时,你总是会得到一个NullPointerException,你需要先在某个地方初始化一个非null值的变量,然后修改它。

如果你不喜欢额外的空检查:

if (Boolean.TRUE.equals(value)) {...}

if (bool)将被编译为if (bool. booleanvalue()),也就是取消装箱,如果bool为null,将抛出NullPointerException。

可空框布尔值的其他解决方案:

JDK 9+ requireNonNullElse(obj, defaultObj) import static java.util.Objects.requireNonNullElse; if (requireNonNullElse(bool, false)) { / / DoSomething 谷歌番石榴18+ firstNonNull(第一,第二) import static com.google.common.base.MoreObjects.firstNonNull; if (firstNonNull(bool, false)) { / / DoSomething

此处使用False作为空大小写的默认值。

当你有一个布尔值时,它可以是真也可以是假。当你有一个布尔值时,它可以是布尔值。真的,布尔。FALSE或null作为任何其他对象。

在您的特定情况下,您的布尔值为null, if语句触发到布尔值的隐式转换,从而产生NullPointerException。你可能需要:

if(bool != null && bool) { ... }