我有以下代码:
Boolean bool = null;
try
{
if (bool)
{
//DoSomething
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
为什么我对布尔变量“bool”的检查导致异常?
当它“看到”它不是真的时,它不应该直接跳过if语句吗?
当我删除if语句或检查它是否为非空时,异常消失了。
Objects.equals ()
K-ballo的回答没有问题。如果你喜欢一个简单的条件,像我一样,你不喜欢尤达条件,因为java 1.7的答案是
if (Objects.equals(bool, true)) {
或者与此同时,如果你更愿意明确一点
if (Objects.equals(bool, Boolean.TRUE)) {
或者更好的做法是:避免这个问题
不建议使用布尔对象,从而允许布尔引用首先为空。像你看到的NullPointerException的风险太大了。如果您需要一种三状态逻辑,那么最好定义一个包含三个值的enum。例如
enum MyTristateBoolean { FALSE, DONT_KNOW, TRUE }
现在我们根本不需要null。中间的常数可能应该命名为UNKNOWN, UNDEFINED, NOT_EXISTING或其他什么,这取决于你的确切情况。如果合适,您甚至可以将其命名为NULL。现在,根据你的口味,你的比较变成了以下两种。
if (myBool.equals(MyTristateBoolean.TRUE)) {
if (myBool == MyTristateBoolean.TRUE) {
后者可以工作,因为编译器保证每个枚举常量只有一个实例。正如你们大多数人所知道的,==对于比较非enum类型的相等对象不起作用。