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を出力します。つまり、nullではありません。ただし、2番目のprintlnはnull例外を発生させます。

私が間違っていることについて何か考えはありますか?

解決

受け入れられた解決策で指摘されたように。問題は、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 メソッドのルールには次のようなものがあります。

  • 非 null 値の再帰x.equals(x)は常に true
  • 非 null 値の対称y.equals(x)はtrue の場合にのみ true を返す必要x.equals(y)があります。
  • が true の場合はnull 以外の値の推移x.equals(y)的であり、が true の場合は true でy.equals(z)あるx.equals(z)必要があります
  • 一貫性オブジェクトが変更されていない場合、equals メソッドは複数の呼び出し中に同じ応答を返す必要があります。
  • 2 つのオブジェクトが等しい場合、hashcoe メソッドは同じ値を返す必要があります。
于 2010-11-08T11:49:46.307 に答える