填充TreeMap会抛出NullPointerException

时间:2010-11-08 11:35:27

标签: java treemap

我在创建TreeMap时遇到NullPointerException。

这是我的代码:

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引发了null异常。

知道我做错了吗?

解决方案

AS指出了公认的解决方案。问题出在我的compareTo实现中。

我曾经有过:

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

答案 0 :(得分:2)

我看起来AccountGroupBean没有以正确的方式实现Comparable,请尝试打印group.compareTo(group)以检查它是否打印0

答案 1 :(得分:1)

这很可能是AccountGroupBean类如何实现equals和hashcode的问题。实现equals和hashcode有一些规则,你应该确保你的代码符合。 equals方法的一些规则包括。

    任何非空值x.equals(x)
  • 自反始终为真
  • 当且仅当y.equals(x)为真时,非空值x.equals(y)
  • Symetric 必须返回true
  • 传递,如果x.equals(y)为真且y.equals(z)为真,则{null}值为真,则x.equals(z)也必须为真
  • 一致如果对象尚未被修改,则equals方法应在多次调用期间返回相同的答案。
  • 如果两个对象相等,则它们的hashcoe方法应该返回相同的值。