带有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
显然,如果param
为null
,则上面抛出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.TRUE
和Boolean.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
而不是boolean
。 Boolean
是一个类,这意味着您可以为其分配对象。 在您的情况下,您传入一个null
,然后将其分配给param。 然后,您尝试使用param,这当然导致了NullPointerException
。
您可以:
- 摆脱线
bool(null)
- 在
bool()
的参数中将Boolean
boolean
更改为boolean
- 如果for为
param
为null
则添加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)); } }
- 使用log4j2,如何记录键值对
- 什么是JVM GC的大对象
- 如何在eclipse上安装maven
- AWS S3 Java:doesObjectExist导致403:FORBIDDEN
- 为什么Java掩码移位操作数为0x1F?
- 可以将Google模块与Google Plugin for Eclipse一起使用吗?
- 列表包含来自另一个列表的至少一个值(Java 8)
- 调用init方法失败; 嵌套exception是java.lang.IllegalArgumentException:对于方法public abstract的查询,validation失败
- 如何将arrayList的元素传递给variadic函数