检查null Boolean是否为true导致异常

时间:2012-06-12 21:40:33

标签: java

我有以下代码:

Boolean bool = null;

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

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

8 个答案:

答案 0 :(得分:324)

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

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

答案 1 :(得分:143)

如果您有boolean,则可以是truefalse。然而,如果您有Boolean,则可以Boolean.TRUEBoolean.FALSEnull作为任何其他对象。

在您的特定情况下,您的Booleannull,而if语句会触发隐式转换为生成boolean的{​​{1}}。您可能需要:

NullPointerException

答案 2 :(得分:62)

使用Apache BooleanUtils

(如果最高性能是项目中最重要的优先级,那么请查看本地解决方案的其他答案之一,这些解决方案不需要包含外部库。)

不要重新发明轮子。利用已经构建的内容并使用isTrue()

BooleanUtils.isTrue( bool );

检查Boolean值是否为真,并通过返回null来处理false

如果您不限于图书馆,那么您可以"允许"要包括,各种用例都有很多很棒的帮助函数,包括BooleansStrings。我建议你仔细阅读各种Apache库,看看它们已经提供了什么。

答案 3 :(得分:12)

Boolean类型可以是null。您需要进行null检查,因为您已将其设置为null

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

答案 4 :(得分:5)

Boolean是基本布尔值的对象包装类。这个类和任何类一样,确实可以为null。出于性能和内存的原因,最好使用原语。

Java API中的包装类有两个主要用途:

  1. 提供一种机制来“包装”对象中的原始值 原语可以包含在为...保留的活动中 对象,如添加到集合中,或从中返回 具有对象返回值的方法。
  2. 提供各种各样的 原语的效用函数。大多数这些功能都是 与各种转换相关:将原语转换为 String对象,将原语和String对象转换为和 来自不同的基数(或基数),如二进制,八进制和 十六进制。
  3. http://en.wikipedia.org/wiki/Primitive_wrapper_class

答案 5 :(得分:3)

或者借助Java 8 Optional的强大功能,您还可以执行以下操作:

Optional.ofNullable(boolValue).orElse(false)

:)

答案 6 :(得分:0)

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

答案 7 :(得分:0)

if (bool) 将被编译为 if (bool.booleanValue()),如果 NPEbool,则会抛出 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 用于此处的空情况。

相关问题