TreeMultimap没有抛出NullPointerException

时间:2018-01-15 09:14:59

标签: nullpointerexception guava multimap

下面的测试示例代码应该在运行时抛出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。

1 个答案:

答案 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