如何在ArrayList中尝试遍历时修复java.util.ConcurrentModificationException错误

时间:2012-05-11 06:06:47

标签: java exception

如果满足条件,我正在尝试将新对象添加到我的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

5 个答案:

答案 0 :(得分:0)

复制数组并更改原始数据。

答案 1 :(得分:0)

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

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

编辑

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

但是,这里的错误实际上很明显是因为你在它上面获得迭代器的那一刻和你使用这个迭代器的那一刻之间向集合中添加了一个元素。要修复临时列表中的新元素,并在迭代结束时将它们全部添加一次。

答案 2 :(得分: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。

答案 3 :(得分: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);
}

答案 4 :(得分: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();
     }
}