我根据另一个问题写了一个简单的简单代码,这里是:
它给我一个错误
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));
}
}
答案 0 :(得分:25)
null
无法自动取消装箱到原始boolean
值,当您尝试将其与true
进行比较时会发生这种情况。在
param == true
true
的类型为boolean
,因此左侧操作数也必须为boolean
。您传递的是Boolean
,这是一个对象,但可以自动取消装箱到boolean
。
因此,这相当于
param.booleanValue() == true
显然,如果param
为null
,则上述内容会NullPointerException
。
为了避免自动拆箱的隐藏陷阱,您可以使用Boolean
对象:
if (Boolean.TRUE.equals(param))
return "a";
if (Boolean.FALSE.equals(param))
return "b";
return "c";
答案 1 :(得分:1)
您的代码会将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";
}
答案 2 :(得分:0)
您使用Boolean
代替boolean
。 Boolean
是一个类,这意味着您可以为其分配对象。在您的情况下,您传入null
,然后将其分配给参数。然后,您尝试使用param,这当然导致了NullPointerException
。
你可以:
bool(null)
Boolean
boolean
更改为bool()
param
为null
答案 3 :(得分:0)
所以你的程序必须是这样的。
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));
}
}
答案 4 :(得分:0)
显然,正如其他人提到的,如果 param 为 null,则下面会抛出 NullPointerException。
param == true
根据 Java 语言规范,通过调用 Boolean.booleanValue()、Number.longValue()、Number.intValue() 等方法进行拆箱。 就像手动调用这些方法一样,NullPointerException 是取消装箱 null 的结果。
如果使用静态代码分析工具处理不当,我们还可以检测这些拆箱漏洞。 请参阅此处了解更多信息Boolean Violation