检查null布尔值是否为true会导致exception

我有以下代码:

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

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

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

在你的具体情况,你的Boolean值为nullif语句触发一个隐式转换为boolean ,产生NullPointerException 。 您可能需要改为:

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

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

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

使用Apache的BooleanUtils 。

不要重新发明轮子。

如果峰值性能是您项目中最重要的优先事项,那么请查看本地解决scheme的其他答案之一,该解决scheme不需要包含外部库。

否则,利用已经构build的内容并使用isTrue()

 BooleanUtils.isTrue( bool ); 

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

如果您不限于“允许”包含的库,那么对于各种用例(包括BooleansStrings都有一大帮助函数。 我build议你仔细阅读各种Apache库,看看他们已经提供了什么。

Booleantypes可以为null 。 您需要执行null检查,因为您已将其设置为null

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

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

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

  1. 提供一种机制来“包装”对象中的原始值,使得原语可以包含在为对象保留的活动中,比如添加到集合中,或者从具有对象返回值的方法返回。
  2. 为基元提供各种实用function。 这些函数中的大多数都与各种转换有关:将字符转换为string对象或将字符转换为字符,将字符和字符对象转换为不同的基(或基),如二进制,八进制和hex。

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

因为你的variablesbool指向一个null,你将总是得到一个NullPointerException,你需要首先在一个非空值的地方初始化variables,然后修改它。