-2
リストを繰り返し処理していないので、ここでは奇妙な振る舞いがあります。リスト上でremoveAllを試行しているときにConcurrentModificationExceptionが発生する(反復処理ではない)
public boolean deleteEvents(ArrayList<EventsModel> list) {
boolean success = false;
synchronized (lock) {
ArrayList<EventsModel> listClone = (ArrayList<EventsModel>) list.clone();
success = processDelete(listClone);
}
return success;
}
private boolean processDelete(List<EventsModel> list) {
boolean success = false;
if (list.size() > 999) {
List<EventsModel> subList = list.subList(0, 998);
list.removeAll(subList); // blows up with ConcurrentModificationException
//
} else {
//
}
return success;
}
私はremoveAll
を正しく使用していませんか?
コード品質に関するサイドノート:ブール値を「リターンコード」として使用すると、それは本当に悪い習慣のようです。あなたは、エラーを示すために例外を投げるか(あなたのメソッドはすべて無効であり、渡すことを意味します:すべて正常です);または、実際のリターンコードのようなオブジェクトを返す必要があります。それ以外は1995年の低レベルのCプログラミングのようなものです。可能;あなたが2016年にしたことではありません。 – GhostCat
http://stackoverflow.com/questions/35294351/potential-bug-using-removeall-called-by-a-collection-on-itself 'subList'はリストのビューを返します。 "write through"を変更します。リンクされた質問を参照してください。コレクション自体で 'removeAll'を呼び出すと、この例外が発生する可能性があります。 – Tunaki
@GhostCatありがとう、私はそれを考慮に入れます。 – vkislicins