带有boolean的java.lang.NullPointerException

我根据另一个问题写了一个简单的简单代码,这里是:

它给我一个错误

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不能自动取消装箱到原始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"; 

您的代码将java.lang.Boolean实例与基本boolean进行比较,这意味着将java.lang.Boolean取消装箱。 由于null无法取消装箱,因此抛出NullPointerException

您可以使用内置常量Boolean.TRUEBoolean.FALSE解决此问题:

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

您使用Boolean而不是booleanBoolean是一个类,这意味着您可以为其分配对象。 在您的情况下,您传入一个null ,然后将其分配给param。 然后,您尝试使用param,这当然导致了NullPointerException

您可以:

  • 摆脱线bool(null)
  • bool()的参数中将Boolean boolean更改为boolean
  • 如果for为paramnull则添加else

所以你的程序必须是这样的。

 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)); } }