
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);
}
}
}
No.3ベストアンサー
- 回答日時:
もう少し確認させてください。
例外の発生箇所はdelHogeIdSetもしくはaddHogeIdSetのremoveの所ですか?
それともobjectHogeDao.deleteByHogeIdの所ですか?
例外は毎回必ず発生しますか?
saveObject(ObjectDto objectDto)の呼び出し側はどの様な実装になってますか?
後はひとまず推測ですが、臭そうな所を当たってみますと、
外側で更にコレクションを回していたりしませんか?
(例えばdaoがデータをキャッシュしていて、それを直接回していたりはしませんか?)
また、スレッドで動作している場合は適切な同期処理が入っていますか?
この回答への補足
スミマセン!!訂正します。
removeが発生しない(と思われる)処理でもエラー発生していました…
ということは、removeだけの問題ではないということですね…
ただ、ローカル環境では発生しないのに、サーバ(高スペック)にあげる
と発生するのはかわりませんでした。
掲示した処理外を通るばあいは発生しませんので、やはりこの処理の記述
の問題だとは思いますが…
回答ありがとうございます。
システムをFlex+javaで開発しているため、saveObject(ObjectDto objectDto)の処理は
Flex側から呼び出されます。
saveObjectを含むClassはHogeService.javaとし、RemoteObjectとしてFlexと連携され
ています。
例外は毎回発生します。
ただ、開発環境(ローカルPC)では発生しません。(これが意味不明で、トレースもしにくい
状況なのですが…)
サーバへアップすると毎回発生します。removeする件数が多いと発生するのかも…と思ったのですが、
条件が変わっても同じでした。
ただ、removeの処理がが発生しない場合は例外も発生しません。
ループの中でremoveするのではなく、removeするコレクションを別に作って分けるしかないでしょうか?
No.2
- 回答日時:
このコードでは判断できないわね。
ここに記述している以外の要素がかかわっているんじゃないかしら。
回答ありがとうございます。
このコードを追記する前は問題なく動いていたのと、ログを見るとこの処理のところで
エラー発生しているようでしたので。。。
コレクションのremoveを実施しているのはここだけのはずなのですが…
もう少しソースチェックもしてみます。
No.1
- 回答日時:
コレクションをループ中に
そのコレクションからremoveすると発生します。
なのでこういう場合は
新規のコレクションを作成し
removeしないものをそっちにコピーするか
remove対象のインデックスを覚えておいて
ループ処理後にインデックス指定でremoveしてください。
回答ありがとうございます。
上記につきましてはいろいろと情報で知っていたので、removeするオブジェクトは
別に作成して実行する(わかりにくいかもですが)ようにしています。
にもかかわらず発生しているため、対応がわからず困っています。
提示しているコード(なぜかインデントがなくなっていますが(-_-;))でお気づきの
事があれば教えてください。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
VB.netでメソッドからコントロ...
-
サーブレットコンテキストの意...
-
エクセルVBA/SpecialCellsで特...
-
Excel VBA 定数にオブジェクト...
-
[ASP.NET]DropDownListのDB連携...
-
servletからjspへオブジェクト...
-
javaで、、、
-
System.Collections.SortedList
-
C#で親にイベントを投げる方法
-
String型からlong型への変換は...
-
Collections.binarySearchについて
-
PrintFormを使用してのプリント
-
VB2005でADDとINSERTの違いは?
-
Mathパッケージ内でのmodの計算...
-
Vba ListViewの行挿入に関して...
-
ArrayListのデバッグ方法について
-
Calendarクラスでエラーがでる
-
VB.NETでのnothing の意義について
-
JSPでのArrayListの表示につい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
Excel VBA 定数にオブジェクト...
-
VB.netでメソッドからコントロ...
-
サーブレットコンテキストの意...
-
VBAでの[]
-
Vba ListViewの行挿入に関して...
-
C#のクラスで値渡しをする
-
C#で親にイベントを投げる方法
-
VB.NETでのnothing の意義について
-
javaで、、、
-
Javaでブラウザ判定
-
System.Collections.SortedList
-
VB2005でADDとINSERTの違いは?
-
servletからjspへオブジェクト...
-
mkdirsでフォルダが作成されない
-
String型からlong型への変換は...
-
JSPでのArrayListの表示につい...
-
UTF-8のテキストファイルを開く...
-
エクセルVBA/SpecialCellsで特...
-
PrintFormを使用してのプリント
おすすめ情報