【发布时间】:2018-03-17 23:40:38
【问题描述】:
我有这个代码:
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 中的行为相同。
【问题讨论】:
-
modifiedItems.get("item1") this 为 null,您知道这一点,但您认为将其传递给 valueOf 不会以 NPE 结束?
-
@Stultuske:这是一个有效的问题,因为上面仅两行将文字
null传递给同一函数不会生成 NPE!这是有充分理由的,但乍一看确实令人困惑:-) -
我印象深刻。这是我多年来看到的最有趣的空指针异常问题。
-
@Jeroen 这不是that question 的骗子。虽然拆箱确实是这两个问题的共同点,但这里没有比较。这个问题的关键在于它的发生是因为解决重载的方式;这与
==的应用方式完全不同。
标签: java nullpointerexception boolean