-PR-
  • すぐに回答を!
  • 質問No.6900010
解決
済み

HashSetのremoveで例外発生します

  • 閲覧数262
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 73% (14/19)

JavaでObjectの保存メソッドを作成したのですが、「java.util.ConcurrentModificationException : null」が発生します。

処理としては、引数のObjectが持っている情報(リスト)と本来登録すべきデータリストを照らしあわせ、追加する必要があるものはaddオブジェクトに削除する必要があるものはdelオブジェクトに残すようにし、最終的にDBデータの追加、削除を実行しています。

おそらく、delHogeIdSet.removeの記述の問題なのではと思ってはいるのですが、改変する良い方法がわかりません。
Hash自身をチェックしてremoveするならiteratorでよいのかもしれませんが、チェックする対象は別オブジェクトなので。。。
removeするたびに各Hashをチェックしてremoveするメソッドを別に作ることでも実現できるかもとは思っていますが、あまりスマートじゃないように思うのです。
上のような方法しかないでしょうか??

他に良い方法があれば教えていただけないでしょうか。よろしくお願いします。


@Override
public void saveObject(ObjectDto objectDto) {

Object object = objectDto.object;
objectDao.saveOrUpdate(object);

// DB登録済みのObjectHogesのHogeを削除用リストとしてセットしておく
HashSet<Long> delHogeIdSet =null;
delHogeIdSet = objectHogeDao.geHogeIdSetByObjectId(object.getObjectId());

// ObjectのHogeSetからセットすべきのHoge一覧を取得する
List<HogeSetHoge> hogeSetHogeList = hogeSetHogeDao.loadByHogeSet(object.getHogeSet().getHogeSetId());

// 追加用Hogeリストをセットしておく
HashSet<Long> addHogeIdSet =null;
addHogeIdSet = hogeSetHogeDao.getHogeIdSetByHogeSetId(object.getHogeSet().getHogeSetId());

if(object.getObjectHoges() != null){
// ユーザのHogeを順にチェック
for(ObjectHoge objectHoge : object.getObjectHoges()){

// セットすべきHoge一覧と比較
for(HogeSetHoge hogeSetHoge : hogeSetHogeList){
// ユーザのHogeと登録が必要なHogeを比較
if(hogeSetHoge.getHoge().getHogeId() == objectHoge.getHoge().getHogeId()){

// dbに登録されている場合は削除リストならびに追加リストからはずす
delHogeIdSet.remove(hogeSetHoge.getHoge().getHogeId());
addHogeIdSet.remove(hogeSetHoge.getHoge().getHogeId());
}
}
}

// delObjectHogeListをDBから削除する
if(delHogeIdSet.size() > 0){
for (Long hogeId : delHogeIdSet){
//
objectHogeDao.deleteByHogeId(hogeId,object.getObjectId());

}
}

// addHogeIdSetをDBに追加する
if(addHogeIdSet.size() > 0){
for (Long hogeId : delHogeIdSet){
ObjectHoge objectHoge = new ObjectHoge();
objectHoge.setObject(object);
Hoge hoge = hogeDao.findById(Hoge.class, hogeId);
objectHoge.setHoge(hoge);

objectHogeDao.saveOrUpdate(objectHoge);

}
}
}
  • 回答数3
  • 気になる数0

質問者が選んだベストアンサー

  • 回答No.3
レベル7

ベストアンサー率 83% (15/18)

もう少し確認させてください。
例外の発生箇所はdelHogeIdSetもしくはaddHogeIdSetのremoveの所ですか?
それともobjectHogeDao.deleteByHogeIdの所ですか?
例外は毎回必ず発生しますか?
saveObject(ObjectDto objectDto)の呼び出し側はどの様な実装になってますか?

後はひとまず推測ですが、臭そうな所を当たってみますと、
外側で更にコレクションを回していたりしませんか?
(例えばdaoがデータをキャッシュしていて、それを直接回していたりはしませんか?)
また、スレッドで動作している場合は適切な同期処理が入っていますか?
補足コメント
kahotaka

お礼率 73% (14/19)

スミマセン!!訂正します。

removeが発生しない(と思われる)処理でもエラー発生していました…
ということは、removeだけの問題ではないということですね…

ただ、ローカル環境では発生しないのに、サーバ(高スペック)にあげる
と発生するのはかわりませんでした。

掲示した処理外を通るばあいは発生しませんので、やはりこの処理の記述
の問題だとは思いますが…
投稿日時 - 2011-07-27 22:48:21
お礼コメント
kahotaka

お礼率 73% (14/19)

回答ありがとうございます。

システムをFlex+javaで開発しているため、saveObject(ObjectDto objectDto)の処理は
Flex側から呼び出されます。
saveObjectを含むClassはHogeService.javaとし、RemoteObjectとしてFlexと連携され
ています。

例外は毎回発生します。
ただ、開発環境(ローカルPC)では発生しません。(これが意味不明で、トレースもしにくい
状況なのですが…)
サーバへアップすると毎回発生します。removeする件数が多いと発生するのかも…と思ったのですが、
条件が変わっても同じでした。
ただ、removeの処理がが発生しない場合は例外も発生しません。

ループの中でremoveするのではなく、removeするコレクションを別に作って分けるしかないでしょうか?
投稿日時 - 2011-07-27 21:51:08
  • ありがとう数0
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル14

ベストアンサー率 34% (1450/4144)

コレクションをループ中に そのコレクションからremoveすると発生します。 なのでこういう場合は 新規のコレクションを作成し removeしないものをそっちにコピーするか remove対象のインデックスを覚えておいて ループ処理後にインデックス指定でremoveしてください。 ...続きを読む
コレクションをループ中に
そのコレクションからremoveすると発生します。

なのでこういう場合は
新規のコレクションを作成し
removeしないものをそっちにコピーするか
remove対象のインデックスを覚えておいて
ループ処理後にインデックス指定でremoveしてください。
お礼コメント
kahotaka

お礼率 73% (14/19)

回答ありがとうございます。

上記につきましてはいろいろと情報で知っていたので、removeするオブジェクトは
別に作成して実行する(わかりにくいかもですが)ようにしています。

にもかかわらず発生しているため、対応がわからず困っています。

提示しているコード(なぜかインデントがなくなっていますが(-_-;))でお気づきの
事があれば教えてください。

よろしくお願いします。
投稿日時 - 2011-07-27 07:11:06
  • ありがとう数0
  • 回答No.2
レベル14

ベストアンサー率 34% (1450/4144)

このコードでは判断できないわね。 ここに記述している以外の要素がかかわっているんじゃないかしら。 ...続きを読む
このコードでは判断できないわね。
ここに記述している以外の要素がかかわっているんじゃないかしら。
お礼コメント
kahotaka

お礼率 73% (14/19)

回答ありがとうございます。

このコードを追記する前は問題なく動いていたのと、ログを見るとこの処理のところで
エラー発生しているようでしたので。。。

コレクションのremoveを実施しているのはここだけのはずなのですが…

もう少しソースチェックもしてみます。
投稿日時 - 2011-07-27 21:40:43
  • ありがとう数0
  • 回答数3
  • 気になる数0
このQ&Aで解決しましたか?

関連するQ&A

-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ