下面的测试示例代码应该在运行时抛出NullPointerException并在控制台中打印一些堆栈跟踪。但它没有这样做。打印第2行,就好像没有发生错误一样。
如果调试执行,则会看到预期的异常 " map.put(k:3L,new House()); map:方法抛出' java.lang.NullPointerException'例外。无法评估com.google.common.collect.TreeMultimap.toString()"。但它不会像运行时异常那样破坏执行。
即使您尝试在第1行捕获NullPointerException,也不会捕获它。
为什么会这样?
import com.google.common.collect.Multimap;
import com.google.common.collect.TreeMultimap;
// from com.google.guava version 18.0
public static void main(String args[]) {
Multimap<Long, House> map = TreeMultimap.create();
map.put(3L, new House()); //**Line 1** . expected to break the execution.
System.out.println("done"); // **Line 2**. expected to not get printed.
}
private static class House implements Comparable{
Integer numberOfRooms_ = null;
@Override
public int hashCode() {
return numberOfRooms_.hashCode(); //NullPointerException generated
}
@Override
public int compareTo(Object o) {
return 1;
}
}
使用jdk 1.7。
答案 0 :(得分:3)
According to Javadoc, TreeMultimap
is an:
Multimap
的实现,其键和值按其自然顺序或提供的比较器排序。 在所有情况下,此实施都使用Comparable.compareTo(T)
或Comparator.compare(T, T)
代替Object.equals(java.lang.Object)
(或hashCode
- Xaerxess)来确定实例的等效性强>
hashCode
未被调用,但compareTo
是,没有NPE被抛出。另一方面,如果您使用HashMultimap
,则无法将hashCode
实施的对象投放到NPE,因为它在引擎盖下使用equals
/ hashCode