Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查null Boolean是否为true会导致异常_Java - Fatal编程技术网

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

Java 检查null Boolean是否为true会导致异常,java,Java,我有以下代码: Boolean bool = null; try { if (bool) { //DoSomething } } catch (Exception e) { System.out.println(e.getMessage()); } 为什么我对布尔变量“bool”的检查会导致异常? 当它“看到”它不是真的时,它不应该跳过if语句吗? 当我删除if语句或检查它是

我有以下代码:

Boolean bool = null;

try 
{
    if (bool)
    {
        //DoSomething
    }                   
} 
catch (Exception e) 
{
    System.out.println(e.getMessage());             
}
为什么我对布尔变量“bool”的检查会导致异常? 当它“看到”它不是真的时,它不应该跳过if语句吗?
当我删除if语句或检查它是否不为null时,异常就会消失。

当您有一个
布尔值时,它可以是
true
false
。然而,当您有一个
布尔值时,它可以是
布尔值.TRUE
布尔值.FALSE
空值
,与任何其他对象一样

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

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

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

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

由于变量bool指向null,因此始终会得到一个NullPointerException,您需要首先使用非null值初始化变量,然后对其进行修改。

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

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

  • 提供在对象中“包装”基元值的机制,以便 原语可以包含在为其保留的活动中 对象,如添加到集合或从 具有对象返回值的方法
  • 提供各种各样的 原语的实用函数。这些功能中的大多数是 与各种转换相关:将原语转换为 字符串对象,并将基本体和字符串对象转换为和 从不同的基(或基数),如二进制、八进制和 十六进制

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

    if (Boolean.TRUE.equals(value)) {...}
    
    使用。

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

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

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


    如果您不局限于“允许”包含的库,那么对于各种用例都有一系列很棒的帮助函数,包括
    Booleans
    Strings
    。我建议您仔细阅读各种Apache库,看看它们已经提供了什么。

    或者使用Java 8的强大功能(可选),您也可以执行以下操作:

    Optional.ofNullable(boolValue).orElse(false)
    

    :)

    如果只是这样,则
    catch
    块将处理NullPointerException。这里的问题是OP试图将空引用取消装箱到原语中。“您将始终”-不总是,除了示例、简化代码,在将变量初始化为
    null
    和测试它之间不做任何事情。假设真正的代码不会那么简单,或者如果可以删除整个
    测试,那么整个
    测试也不会那么简单。上面关于对象拆箱的答案都是正确的。但是,为了完整性起见,您还可以将代码更改为使用原语“boolean”而不是对象包装器“boolean”。你还应该重新认识原语和对象之间的区别<代码>如果(bool==Boolean.TRUE)
    计算结果为false而不生成异常。不确定这是否是我刚刚发现的案例中的故意行为。@simon.watts对于
    bool
    null
    Boolean
    是显式构造的(而不是引用
    Boolean.TRUE
    )。所以不推荐;与
    if(Boolean.TRUE.equals(bool))
    相反,if(Boolean.TRUE.equals(bool))
    可以按预期工作,包括安全地处理
    null
    值。从技术上讲,
    Boolean
    可以是任意数量的真实例,而不仅仅是
    Boolean.TRUE
    。例如
    new Boolean(true)
    。我很难理解为什么
    if(myBoolean)
    (其中
    myBoolean
    Boolean
    )不会引发编译器错误或至少警告。“这肯定是个骗局。”乔希姆。这是因为Java对包装器进行装箱和拆箱:@Vinicius当然可以,但是编译器应该在这种情况下为我们执行null,至少通过编译器警告执行。@AvrDragon:需要等于吗?运算符==在这里工作,因为布尔值只有两个values@Atul是的,这里要求相等。因为(new Boolean(true)==new Boolean(true))是。。。。错。原因:BooleanUtils只是一个类,可以像java中的任何其他类一样有多个实例。是的,这是一个遗憾,构造函数应该是私有的,因此它可以确保它是一个twingleton…这正是Apache BooleanUtils的
    BooleanUtils.isTrue(bool)所做的
    是的。使用Apache BooleanUtils完全没有意义。当替代方法是使用外部库来实现像这样的基本功能时,重新发明轮子似乎并没有那么糟糕。@PaulManta我同意这是您在Apache Utils库中使用过的唯一东西,但建议的想法是“仔细阅读”这些库使您能够接触到其他有用的功能。该库正在重新发明轮子。我尽量避免使用此类库。@mschonaker如果Apache BooleanUtils正在重新发明轮子,那么最初的轮子是什么?这样做的目的是避免创建一系列的助手函数,这些函数模仿了像这样的库中已经完成的工作。在我的所有应用程序中,我也使用这个库中的
    toStringYesNo
    。原始控制盘不是
    Boolean.TRUE.equals(bool)
    ?代码中肯定有一些有用的方法
    Optional.ofNullable(boolValue).orElse(false)