Заполнение TreeMap вызывает исключение NullPointerException - PullRequest
1 голос
/ 08 ноября 2010

Я получаю исключение NullPointerException при создании TreeMap.

Вот мой код:

public TreeMap<AccountGroupBean,List<AccountBean>> getAccountsAndGroups() throws SessionExpiredException {
    TreeMap<AccountGroupBean,List<AccountBean>> map = new TreeMap<AccountGroupBean,List<AccountBean>>();
    List<AccountGroupBean> groups = getAccountGroups();
    for(AccountGroupBean group : groups) {
        List<AccountBean> accounts = getAccountsByGroupId(group.getId());
        System.out.println("PRINT"+ accounts.size());           
        map.put(group,accounts);
        System.out.println("!" +map.get(group).size());
    }
    return map;
}

Первый println печатает 44. То есть это не равно нулю.Тем не менее, второй println вызывает нулевое исключение.

Есть идеи, что я делаю не так?

Решение

Как указано в принятом решении.Проблема была в моей реализации сравнения.

Раньше у меня было:

public int compareTo(AccountGroupBean o) {
    return (number > o.getNumber()) ? 1 : -1;       
}

Добавление возврата 0 решило проблему:

public int compareTo(AccountGroupBean o) {
    if(number == o.getNumber()) {
         return 0;
    }
    return (number > o.getNumber()) ? 1 : -1;       
}

Ответы [ 2 ]

2 голосов
/ 08 ноября 2010

Похоже, AccountGroupBean неправильно реализует Comparable, попробуйте напечатать group.compareTo(group), чтобы проверить, печатает ли 0.

1 голос
/ 08 ноября 2010

Это, скорее всего, проблема с тем, как класс AccountGroupBean реализует equals и hashcode.Есть некоторые правила для реализации equals и hashcode, которые вы должны убедиться, что ваш код соответствует.Вот некоторые из правил для метода равенства:

  • Рефлексивное для любого ненулевого значения x.equals(x) всегда верно
  • Симметричное для ненулевых значений y.equals(x) должен возвращать истину тогда и только тогда, когда x.equals(y) является истинным
  • Транзитивно для ненулевых значений, если x.equals(y) является истинным и y.equals(z) является истинным, тогда x.equals(z) также должно быть истинным
  • Consistant Метод equals должен возвращать один и тот же ответ при нескольких вызовах, если объекты не были модифицированы.
  • Если два объекта равны, ихМетод hashcoe должен возвращать то же значение.
...