我有这样的代码:
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
}
}
我的问题是,我不明白为什么测试3工作得很好(它打印false
,但不产生NullPointerException
),而测试4抛出一个NullPointerException
。正如您在测试1和测试2中看到的,null
和modifiedItems.get("item1")
是equals和null
。
Java 7和8中的行为是相同的。
发布于 2017-10-07 01:28:16
理解它的一种方法是,当Boolean.valueOf(null)
被调用时,java被告知计算null。
然而,当Boolean.valueOf(modifiedItems.get("item1"))
被调用时,java被告知从Boolean对象类型的HashTable中获取一个值,但是它没有找到Boolean类型,而是发现了一个死胡同(null),尽管它需要Boolean。抛出NullPointerException异常是因为java的这一部分的创建者认为这种情况是程序中出错的一个实例,需要程序员的注意。(意外发生了一些事情。)
在这种情况下,它更多的是故意声明您想要的null在那里,和java找到一个对象(null)的缺失引用之间的区别。
在以下答案中查看有关NullPointerException的更多信息:https://stackoverflow.com/a/25721181/4425643
https://stackoverflow.com/questions/46601104
复制相似问题