2016-08-11 22 views
-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を正しく使用していませんか?

+2

コード品質に関するサイドノート:ブール値を「リターンコード」として使用すると、それは本当に悪い習慣のようです。あなたは、エラーを示すために例外を投げるか(あなたのメソッドはすべて無効であり、渡すことを意味します:すべて正常です);または、実際のリターンコードのようなオブジェクトを返す必要があります。それ以外は1995年の低レベルのCプログラミングのようなものです。可能;あなたが2016年にしたことではありません。 – GhostCat

+1

http://stackoverflow.com/questions/35294351/potential-bug-using-removeall-called-by-a-collection-on-itself 'subList'はリストのビューを返します。 "write through"を変更します。リンクされた質問を参照してください。コレクション自体で 'removeAll'を呼び出すと、この例外が発生する可能性があります。 – Tunaki

+0

@GhostCatありがとう、私はそれを考慮に入れます。 – vkislicins

答えて

0

あなたは、この例外の原因となっているのは、removeAllと組み合わせてsubList()を使用することです。 subListのjavadocを読んでもっと理解することができます。

+0

すでにコメントからそれを得ていますが、返信ありがとう – vkislicins

関連する問題