1

条件を満たしている場合は、ArrayListに新しいオブジェクトを追加しようとしています。しかし、私がそれを実行しようとしたとき、それは私にこのConcurrentModificationExeptionを手に入れました。あなたが私を助けてくれることを願っています:

public void addTaskCollection(Task t){ 
    ListIterator<Task> iterator = this.taskCollection.listIterator();
    if(this.taskCollection.isEmpty())
        this.taskCollection.add(t);
    while (iterator.hasNext()){
        if(t.isOverlapped(iterator.next()))
            this.taskCollection.add(t);
    }    
}

そしてここに例外エラーがあります

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at Diary.addTaskCollection(Diary.java:36)
at Test.main(Test.java:50)
Java Result: 1
4

5 に答える 5

0

配列をコピーして、元の配列を変更します。

于 2012-05-11T06:07:55.973 に答える
0

コードを次のように置き換えます。

ListIterator<Task> iterator = this.taskCollection.listIterator();
boolean marker = false;

if(taskCollection.isEmpty())
    this.taskCollection.add(t);
else {
   while (iterator.hasNext()) {
      if(iterator.next().isOverlapped(t) == false)
         marker = true;
   }
}

if (marker == true)
    taskCollection.add(t);

ConcurrentModificationExceptionを回避します。

于 2012-05-11T06:25:19.143 に答える
0

競合状態に遭遇したようです。複数のスレッドが同じコレクションにアクセスまたは変更しています。スレッドセーフな List 実装を使用してください。

また、Iterator を使用してコレクションを反復処理している間は、コレクションを変更 (追加/削除) しないでください。

編集

ConcurrentModificationExeptionは、taskCollection が複数のスレッドによって同時にアクセスおよび変更されているように聞こえます (プログラムがシングル スレッドまたはマルチ スレッドの場合、提供するコードについては言えません)。複数のスレッド間で taskCollection を共有する場合は、スレッドセーフなリスト実装を使用してください。

しかし、ここでのエラーは実際には明らかに、イテレータを取得してからこのイテレータを使用するまでの間に要素をコレクションに追加したことが原因です。それを修正するには、新しい要素を一時リストにコピーし、反復の最後に一度にすべて追加します。

于 2012-05-11T06:18:59.393 に答える
0

2 つの反復子を維持します。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Example_v3 {

     public static void main(String[] args) {
          List<String> list = new ArrayList<String>();

          // Insert some sample values.
          list.add("Value1");
          list.add("Value2");
          list.add("Value3");

          // Get two iterators.
          Iterator<String> ite = list.iterator();
          Iterator<String> ite2 = list.iterator();

          // Point to the first object of the list and then, remove it.
          ite.next();
          ite.remove();

          /* The second iterator tries to remove the first object as well. The object does
           * not exist and thus, a ConcurrentModificationException is thrown. */
          ite2.next();
          ite2.remove();
     }
}
于 2014-10-15T07:39:11.687 に答える
0

コメントから Truong の回答を再フォーマットしました。

ListIterator<Task> iterator = this.taskCollection.listIterator();
boolean marker = false;

if(taskCollection.isEmpty())
  this.taskCollection.add(t);
else {
  while (iterator.hasNext()) {
    if(iterator.next().isOverlapped(t) == false)
      marker = true;
  }
  if (marker == true)
    taskCollection.add(t);
}
于 2013-08-14T20:45:06.450 に答える