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

看来您遇到了竞争条件。多个线程正在访问/修改同一个集合。使用线程安全的 List 实现。

此外,您不得在使用迭代器对其进行迭代时修改集合(添加/删除)。

编辑

ConcurrentModificationExeption听起来好像 taskCollection 被多个线程同时访问和修改(如果您的程序是单线程或多线程,我们不能说您提供的代码段)。如果您在多个线程之间共享 taskCollection,请使用线程安全列表实现。

但是,这里的错误实际上显然是由于您在获得迭代器的那一刻和使用该迭代器的那一刻之间向集合中添加了一个元素。要修复该问题,将临时列表中的新元素复制并在迭代结束时将它们全部添加一次。

于 2012-05-11T06:18:59.393 回答
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

从评论中重新格式化了 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 回答
0

维护两个迭代器。

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 回答