带有布尔值的java.lang.NullPointerException
我根据另一个问题编写了一个非常简单的代码,如下所示: 这给我带来了一个错误 java.lang.NullPointerException第5行和第17行 我不知道我做错了什么带有布尔值的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
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.