我有以下代码:

Boolean bool = null;

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

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


当前回答

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

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

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

其他回答

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

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

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

布尔类型可以为空。你需要做一个空检查,因为你已经把它设置为空。

if (bool != null && bool)
{
  //DoSomething
}                   

或者借助Java 8 Optional的强大功能,你也可以做到这样的技巧:

Optional.ofNullable(boolValue).orElse(false)

:)

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

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作为空大小写的默认值。