我正在使用番石榴多图(TreeMultiMap)。我正在做一些单元测试以确保它正常,但是当我进行以下测试时,我从番石榴得到了空指针异常(我已经整理了一些代码来重新创建它)。在下面,仅假设位置/互连是简单的类。自然顺序是由位置的ID决定的,即以下代码中的50、51。

Multimap<Location, Interconnect> interconnects;
interconnects = TreeMultimap.create();

Location l1 = new Location(50, "Test Location 1");
assertTrue(interconnects.put(l1, null));

Location l2 = new Location(51, "Test Location 2");
assertTrue(interconnects.put(l2, null));

//expect false but get null exception
assertFalse(locs.addLocation(l9));


我本以为要添加的最后一行将仅返回false,但这会导致异常。

如果我将null更改为值,则第二个l9如我所料返回false。

怎么了我只想到Maps只允许一个null键,但这不是标准的map,也不是key,而是值。

测试它的原因是,我希望允许添加不带任何值的Location(因为它们可能未知),然后允许在已知时添加它们。我很感谢我可以检查是否有空值重复项,但我想知道为什么在这种情况下失败了。

最佳答案

您正在使用TreeMultimap,这意味着这些值必须支持compareTo方法。尝试对compareTo值使用null会抛出NullPointerException

除了当您添加一个值时,没有其他值可与之比较,因此compareTo直到第二个值才被调用,此时所有内容都消失了。 TreeSet具有类似的问题,尽管它们可能已在Java的最新版本中得到修复。

解决方法包括在Ordering.natural().nullsFirst()中使用Comparator或另一个接受空值的TreeMultimap,或使用另一个Multimap实现。

FWIW,Guava的Multimap并非旨在以您的使用方式使用,带有“没有任何值的位置”。您最好回到传统的Map<Key, Set<Value>>

09-13 00:57