我有以下代码:
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
}
}
我的问题是我不明白为什么Test 3可以正常工作(它打印false并且不产生NullPointerException),而Test 4却抛出了NullPointerException。正如你可以看到测试1和2,null和modifiedItems.get("item1")是平等的和null。
Java 7和8中的行为相同。
null给同一函数的上方两行不会生成NPE!这样做有充分的理由,但是乍一看肯定会令人困惑:-)