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

Bir*_*man 158 java

我有以下代码:

Boolean bool = null;

try 
{
    if (bool)
    {
        //DoSomething
    }                   
} 
catch (Exception e) 
{
    System.out.println(e.getMessage());             
}
Run Code Online (Sandbox Code Playgroud)

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

Avr*_*gon 360

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

if (Boolean.TRUE.equals(value)) {...}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是一个耻辱,构造函数应该是私有的,所以它确保它是一个twingleton ... (32认同)
  • @fortran为"twingleton"+1. (14认同)
  • 这正是 Apache BooleanUtils 的“BooleanUtils.isTrue( bool );”所做的。 (5认同)
  • @Atul是的,这里需要等于.因为(new Boolean(true)== new Boolean(true))是...... false.原因:Boolean只是一个类,可以像java中的任何其他类一样拥有多个实例. (4认同)
  • 在这个习惯用法上使用 Apache BooleanUtils 绝对没有意义。 (4认同)
  • @AvrDragon:是否需要等于?运算符 == 在这里起作用,因为布尔值只有两个值 (3认同)

K-b*_*llo 159

当你有boolean它可以是truefalse.然而,当你有一个Boolean它可以是Boolean.TRUE,Boolean.FALSEnull任何其他对象.

在您的特定情况下,您的Booleanis nullif语句触发隐式转换,boolean从而生成NullPointerException.您可能需要:

if(bool != null && bool) { ... }
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,"布尔"可以是任意数量的真实实例,而不仅仅是"Boolean.TRUE".例如`new Boolean(true)`. (22认同)
  • @Vinicius 当然,但是在这种情况下,编译器应该为我们做 null ,至少通过编译器警告。 (5认同)
  • 我很难理解为什么 `if (myBoolean)`(其中 `myBoolean` 是 `Boolean`)不会引发编译器错误或至少是警告。这肯定是一个陷阱。 (3认同)
  • @乔希M。这是因为 Java 对包装器进行_装箱_ 和_拆箱_:https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html (2认同)

Jos*_*ter 67

使用Apache BooleanUtils.

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

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

BooleanUtils.isTrue( bool );
Run Code Online (Sandbox Code Playgroud)

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

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

  • 当替代方案使用外部库作为基本的东西时,重新发明轮子似乎并不那么糟糕. (57认同)
  • *那个*库正在重新发明轮子.我试图尽可能避免使用这些库. (6认同)
  • @PaulManta我同意,如果这是你在Apache Utils库中使用的唯一东西,但建议的想法是"仔细阅读"库以使自己暴露于其他有用的功能. (3认同)
  • @mschonaker如果Apache BooleanUtils正在重新发明轮子,那么_original_ wheel是什么?我们的想法是避免创建一堆辅助函数来模仿像这样的库中已经完成的工作.我还在我的所有应用程序中使用了来自此库的`toStringYesNo`. (2认同)
  • 原来的轮子不是`Boolean.TRUE.equals(bool)`吗?`BooleanUtils` 中肯定有一些有用的方法,但你不需要它。 (2认同)

pro*_*ota 18

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

Optional.ofNullable(boolValue).orElse(false)
Run Code Online (Sandbox Code Playgroud)

:)

  • 这个答案应该得到更多的认可,但这只是我的看法。 (5认同)

fas*_*ava 13

Boolean类型可以null.您需要在null设置时进行检查null.

if (bool != null && bool)
{
  //DoSomething
}                   
Run Code Online (Sandbox Code Playgroud)

  • 异常处理是不必要的,除此之外,它是以一种初学者的坏榜样的方式完成的.这值得投票,IMO.(是的......我知道它来自示例代码,但在答案中重复它似乎支持它.) (13认同)
  • 正确的方法是上面的..没有异常处理.此外,异常处理过于笼统,不鼓励. (5认同)
  • 这个答案有什么问题?这不是检查将抛出异常的bool.不必要的downvotes. (3认同)
  • 我同意这是一个非常合理的答案.你可以摆脱异常处理. (2认同)

Orl*_*lan 5

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

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

  1. 提供一种机制来"包装"对象中的原始值,以便原语可以包含在为对象保留的活动中,例如添加到集合中,或者从具有对象返回值的方法返回.
  2. 为基元提供各种实用程序功能.这些函数中的大多数与各种转换有关:将原语转换为String对象,从而将原语和String对象转换为不同的基数(或基数),例如二进制,八进制和十六进制.

http://en.wikipedia.org/wiki/Primitive_wrapper_class