摆脱并发修改异常

时间:2013-09-10 18:27:08

标签: java arraylist

我在java中有一个小问题。我试图循环遍历ArrayList并在循环期间向同一个arraylist添加更多项目并获得concurrentModificationexception。解决这个问题的方法是什么,我的代码是这样的

ArrayList“Errors”已经填充。

ArrayList<MainErrorObject> errors;
ArrayList<MainErrorObject> newList;

for (MainErrorObject current : errors)
{
   newList = processErrorObjects(current);
   errors.addall(newList);
}

当我尝试执行上面的代码时,我得到并发修改异常。请帮我解决这个问题。

提前致谢。

3 个答案:

答案 0 :(得分:2)

你不能迭代&amp;修改同一个集合。因此,有一个临时的ArrayList,并在迭代完成后将内容复制到主列表中。

ArrayList<MainErrorObject> tempErrors;
    for( meObject : Errors ){

      newList = processErrorObjects();
      tempErrors.addAll(newList);

    }    
Errors.addAll(tempErrors);

Ps:遵循java命名约定

答案 1 :(得分:1)

您可以使用Iterator课程并使用add()中的Iterator方法,如下所示:

ListIterator<MainErrorObject> it = Errors.listIterator();
MainErrorObject me = null;

while(it.hasNext()) {
   me = it.next();
   if (//condition)
       it.add(item);
}

永远不会抛出这样的异常,因为它足够聪明地处理所说的并发修改。

来源:ListIterator javadocs

答案 2 :(得分:1)

使用ListIterator

  

为了避免java.util.ConcurrentModificationException异常,我们可以通过list的迭代器添加一个项目

for (ListIterator<MainErrorObject> itr = Errors.listIterator(); itr.hasNext();)
{
      newList = processErrorObjects(itr.next());
      for( MainErrorObject obj : newList)
      {
          itr.add(obj);
      }

}