带有boolean的java.lang.NullPointerException

时间:2014-09-13 14:40:35

标签: 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){
            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));


    }
}

5 个答案:

答案 0 :(得分:25)

null无法自动取消装箱到原始boolean值,当您尝试将其与true进行比较时会发生这种情况。在

param == true

true的类型为boolean,因此左侧操作数也必须为boolean。您传递的是Boolean,这是一个对象,但可以自动取消装箱到boolean

因此,这相当于

param.booleanValue() == true

显然,如果paramnull,则上述内容会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.TRUEBoolean.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代替booleanBoolean是一个类,这意味着您可以为其分配对象。在您的情况下,您传入null,然后将其分配给参数。然后,您尝试使用param,这当然导致了NullPointerException

你可以:

  • 摆脱行bool(null)
  • Boolean
  • 的参数中将boolean更改为bool()
  • 如果paramnull
  • ,则添加其他内容

答案 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