Java Boolean.valueOf()有时会生成NullPointerException
我有以下代码:Java Boolean.valueOf()有时会生成NullPointerException,java,nullpointerexception,boolean,Java,Nullpointerexception,Boolean,我有以下代码: package tests; import java.util.Hashtable; public class Tests { public static void main(String[] args) { Hashtable<String, Boolean> modifiedItems = new Hashtable<String, Boolean>(); System.out.println("TES
package tests;
import java.util.Hashtable;
public class Tests {
public static void main(String[] args) {
Hashtable<String, Boolean> modifiedItems = new Hashtable<String, Boolean>();
System.out.println("TEST 1");
System.out.println(modifiedItems.get("item1")); // Prints null
System.out.println("TEST 2");
System.out.println(modifiedItems.get("item1") == null); // Prints true
System.out.println("TEST 3");
System.out.println(Boolean.valueOf(null)); // Prints false
System.out.println("TEST 4");
System.out.println(Boolean.valueOf(modifiedItems.get("item1"))); // Produces NullPointerException
System.out.println("FINISHED!"); // Never executed
}
}
包测试;
导入java.util.Hashtable;
公开课考试{
公共静态void main(字符串[]args){
Hashtable modifiedItems=新Hashtable();
系统输出打印项次(“测试1”);
System.out.println(modifiedItems.get(“item1”);//打印空值
系统输出打印项次(“测试2”);
System.out.println(modifiedItems.get(“item1”)==null);//打印为true
系统输出打印项次(“测试3”);
System.out.println(Boolean.valueOf(null));//打印错误
系统输出打印项次(“测试4”);
System.out.println(Boolean.valueOf(modifiedItems.get(“item1”));//生成NullPointerException
System.out.println(“完成!”;//从未执行
}
}
我的问题是,我不理解为什么测试3工作正常(它打印false
,并且不产生NullPointerException
),同时测试4抛出一个NullPointerException
。正如您在测试1和2中所看到的,null
和modifiedItems.get(“item1”)
是相等的,而null
Java 7和Java 8中的行为是相同的。因为
modifiedItems.get
返回一个布尔值
(这是不可强制转换为字符串
),所以将使用的签名是,布尔值
被装箱为一个基元布尔值
。返回null
后,outboxing将失败,出现NullPointerException
您必须仔细查看调用的重载:
正在调用。即使提供了null参数,也不会抛出Boolean.valueOf(null)
NPE
正在调用,因为Boolean.valueOf(modifiedItems.get(“item1”)
的值属于modifiedItems
类型,需要进行拆箱转换。由于Boolean
为modifiedItems.get(“item1”)
,因此引发NPE的是该值的解装箱,而不是null
Boolean.valueOf(…)
确定调用哪个重载的规则如下,但大致如下:
- 在第一个过程中,搜索方法匹配,而不允许装箱/取消装箱(也不允许变量arity方法)
- 由于
是null
的可接受值,但不是字符串
,布尔值
与本过程中的boolean.valueOf(null)
匹配李>boolean.valueOf(String)
对于Boolean
或Boolean.valueOf(String)
都是不可接受的,因此在此过程中没有与Boolean.valueOf(Boolean)
匹配的方法Boolean.valueOf(modifiedItems.get(“item1”)
- 由于
- 在第二个过程中,搜索方法匹配,允许装箱/取消装箱(但仍然不允许变量arity方法)
可以取消绑定为Boolean
,因此Boolean
在此过程中与Boolean.valueOf(Boolean)
匹配;但是编译器必须插入取消装箱转换才能调用它:Boolean.valueOf(modifiedItems.get(“item1”)
Boolean.valueOf(modifiedItems.get(“item1”).booleanValue())
- (第三个过程允许使用可变算术方法,但这与这里无关,因为前两个过程与这些情况相匹配)
Boolean.valueOf(…)
有两个签名:
公共静态布尔值(布尔b)
公共静态布尔值(字符串s)
modifiedItems
值是Boolean
。您不能将布尔值
强制转换为字符串
,因此将选择第一个签名
布尔解装箱
在你的声明中
Boolean.valueOf(modifiedItems.get("item1"))
可以理解为
Boolean.valueOf(modifiedItems.get("item1").booleanValue())
但是,modifiedItems.get(“item1”)
返回null
,因此基本上
null.booleanValue()
这显然导致了
NullPointerException
,因为Andy已经很好地描述了NullPointerException
的原因:
这是由于布尔非装箱:
Boolean.valueOf(modifiedItems.get("item1"))
转换为:
Boolean.valueOf(modifiedItems.get("item1").booleanValue())
在运行时,如果modifiedItems.get(“item1”)
为null,则抛出NullPointerException
现在我想在这里再补充一点,如果下面的类的相应返回对象为null,那么将这些类取消装箱到它们各自的原语中也会产生NullPointerException
exception
Hashtable<String, Boolean> modifiedItems1 = new Hashtable<String, Boolean>();
System.out.println(Boolean.valueOf(modifiedItems1.get("item1")));//Exception in thread "main" java.lang.NullPointerException
Hashtable<String, Byte> modifiedItems2 = new Hashtable<String, Byte>();
System.out.println(Byte.valueOf(modifiedItems2.get("item1")));//Exception in thread "main" java.lang.NullPointerException
Hashtable<String, Character> modifiedItems3 = new Hashtable<String, Character>();
System.out.println(Character.valueOf(modifiedItems3.get("item1")));//Exception in thread "main" java.lang.NullPointerException
Hashtable<String, Float> modifiedItems4 = new Hashtable<String, Float>();
System.out.println(Float.valueOf(modifiedItems4.get("item1")));//Exception in thread "main" java.lang.NullPointerException
Hashtable<String, Integer> modifiedItems5 = new Hashtable<String, Integer>();
System.out.println(Integer.valueOf(modifiedItems5.get("item1")));//Exception in thread "main" java.lang.NullPointerException
Hashtable<String, Long> modifiedItems6 = new Hashtable<String, Long>();
System.out.println(Long.valueOf(modifiedItems6.get("item1")));//Exception in thread "main" java.lang.NullPointerException
Hashtable<String, Short> modifiedItems7 = new Hashtable<String, Short>();
System.out.println(Short.valueOf(modifiedItems7.get("item1")));//Exception in thread "main" java.lang.NullPointerException
Hashtable<String, Double> modifiedItems8 = new Hashtable<String, Double>();
System.out.println(Double.valueOf(modifiedItems8.get("item1")));//Exception in thread "main" java.lang.NullPointerException
Hashtable modifiedItems1=new Hashtable();
System.out.println(Boolean.valueOf(modifiedItems1.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
Hashtable modifiedItems2=新Hashtable();
System.out.println(Byte.valueOf(modifiedItems2.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
Hashtable modifiedItems3=新Hashtable();
System.out.println(Character.valueOf(modifiedItems3.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
Hashtable modifiedItems4=新Hashtable();
System.out.println(Float.valueOf(modifiedItems4.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
Hashtable modifiedItems5=新Hashtable();
System.out.println(Integer.valueOf(modifiedItems5.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
Hashtable modifiedItems6=新Hashtable();
System.out.println(Long.valueOf(modifiedItems6.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
Hashtable modifiedItems7=新Hashtable();
System.out.println(缩写为valueOf(modifiedItems7.get(“item1”))/