1

创建 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;       
}
4

2 回答 2

2

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

于 2010-11-08T11:57:15.163 回答
1

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

  • 任何非空值的自反x.equals(x)始终为真
  • y.equals(x)当且仅当x.equals(y)为真时,非空值的对称必须返回真
  • 非空值的传递x.equals(y)如果为真且y.equals(z)为真则x.equals(z)也必须为真
  • 一致如果对象没有被修改,equals 方法应该在多次调用期间返回相同的答案。
  • 如果两个对象相等,它们的 hashcoe 方法应该返回相同的值。
于 2010-11-08T11:49:46.307 回答