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)