带有布尔值的java.lang.NullPointerException

带有布尔值的java.lang.NullPointerException,java,methods,Java,Methods,我根据另一个问题编写了一个非常简单的代码,如下所示: 这给我带来了一个错误 java.lang.NullPointerException第5行和第17行 我不知道我做错了什么 public class Main { public static String bool(Boolean param){ if(param == true){ (line 5) return "a"; }else if(param == false

我根据另一个问题编写了一个非常简单的代码,如下所示:

这给我带来了一个错误

java.lang.NullPointerException第5行和第17行

我不知道我做错了什么

 public class Main {

    public static String bool(Boolean param){
        if(param == true){    (line 5)
            return "a";
        }else if(param == false){
            return "b";
        }
        return "c";

    }

    public static void main(String[] args){

        System.out.println(bool(true));
        System.out.println(bool(null)); (line 17)
        System.out.println(bool(false));


    }
}

null
无法自动取消绑定到基本
布尔值,这是您尝试将其与
true
进行比较时发生的情况。在

param == true
true
的类型是
boolean
,因此左侧操作数也必须是
boolean
。您正在传入一个
布尔值
,它是一个对象,但可以自动解除绑定到
布尔值

因此,这相当于

param.booleanValue() == true
显然,如果
param
null
,则上述操作会引发
NullPointerException

为了避免自动取消装箱的隐藏陷阱,您可以使用
布尔对象:

if (Boolean.TRUE.equals(param))
  return "a";
if (Boolean.FALSE.equals(param))
  return "b";
return "c";

您使用了
Boolean
而不是
Boolean
<代码>布尔值
是一个类,这意味着您可以将对象指定给它。在本例中,您传入了一个
null
,然后将其分配给param。然后,您尝试使用param,这当然会导致出现
NullPointerException

你可以:

  • 去掉行
    bool(null)
  • bool()的参数中的
    Boolean
    更改为
    Boolean
  • 如果
    param
    null

您的代码将
java.lang.Boolean
实例与原语
Boolean
进行比较,这意味着取消绑定
java.lang.Boolean
。由于无法取消绑定
null
,因此会引发
NullPointerException

您可以通过使用内置常量
Boolean.TRUE
Boolean.FALSE
来解决此问题:

public static String bool(Boolean param) {
    if (Boolean.TRUE.equals(param)) {
        return "a";
    } else if (Boolean.FALSE.equals(param)) {
        return "b";
    }
    return "c";
}

所以你的程序一定是这样的

public class BooleanBug {

    public static String bool(Boolean param) {
        if ((null != param) && param.booleanValue() == true) {
            return "a";
        } else if ((null != param) && param.booleanValue() == false) {
            return "b";
        }
        return "c";

    }

    public static void main(String[] args) {

        System.out.println(bool(true));
        System.out.println(bool(null));
        System.out.println(bool(false));

    }
}

如果可能的话,或者如果必须使用Boolean(或其他包装类类型),避免使用Boolean的一个原因是,在使用它之前先测试它是否为null。@HovercraftFullOfEels这是我们几分钟前的朋友,正在测试他的赋值问题的解决方案:)@MarkoTopolnik:的确如此。答案是1+。布尔静态和方法的伟大技巧的可能复制品,它将代码简化得如此之多+1这同样有效:
import static java.lang.Boolean.TRUE;如果(param==TRUE){}
@sorin7486它通常不起作用:
new Boolean(TRUE)!=Boolean.TRUE
@MarkoTopolnik您是对的。。我说过我不喜欢java吗?:)布尔静态和方法的伟大技巧,它简化了代码这么多+1.