
Если в TreeMap передан компаратор, который не допускает работу с null, то попытка передать null в качестве ключа также приведет к выбросу NullPointerException.
class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
}
}
Map<String, Integer> map = new TreeMap<>(new MyComparator());
map.put("aaa", 111);
map.put("hhh", 222);
map.put(null, 555); // java.lang.NullPointerException
В этом примере когда TreeMap вызовет метод compare(), из объекта o1 будет вызван метод toString(), который, в свою очередь, приведёт к выбросу NullPointerException, т.к. o1 является null.Если переписать компаратор как в примере ниже, то в качестве ключа можно свободно передавать null, поскольку ему абсолютно не важно какой объект передан для сравнения.
class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
return -1;
}
}
System.out.println(map); // {null=555, hhh=222, aaa=111}