Object ArrayList的并发修改错误

时间:2014-07-01 15:22:54

标签: java concurrentmodification

我已经搜索了我的问题的答案但没有任何效果。 这是我的代码。

public ArrayList<Exercise> checkList()
{
    Criteria a = this.getCriteria();
    ArrayList<Exercise> z = this.getExercise();
    for(Exercise c : z)
    {
        if(!compareSkillLevel(c,a)|| !compareEquipment(c)|| !compareFocus(c)
                || !compareTraining(c))
            z.remove(c);
    }
    return z; 

}

运行此操作后,我得到了一个Conncurrent Modification Exeption。

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at randomworkout.List.checkList(List.java:161)
at Main.main(Main.java:46)

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

正如其他答案所指出的,你在这里遇到的问题是你在迭代它时试图从列表中删除。除非使用迭代器的remove方法删除元素,否则java中不允许这样做。这意味着您有两种方法来修复此代码。

1:

for(Iterator<Exercise> iterator = z.iterator(); iterator.hasNext();)
{
    Exercise c = iterator.next();
    if(!compareSkillLevel(c,a)|| !compareEquipment(c)|| !compareFocus(c)
            || !compareTraining(c))
        iterator.remove();
}

或者,您可以使用其索引遍历数组列表,而是执行类似

的操作

2:

for(int i = 0;i < z.size(); i++)
{
    Exercise c = z.get(i);
    if(!compareSkillLevel(c,a)|| !compareEquipment(c)|| !compareFocus(c)
            || !compareTraining(c))
        z.remove(i--)
}

请注意这里的i--,这是必要的,因为从ArrayList移除元素的行为会将现有元素移位,这意味着您要检查的下一个元素位于最后一个元素的位置元件。

答案 1 :(得分:0)

您在迭代时删除,这会导致此异常 要解决问题,请使用Iterator (ListIterator)并致电iterator.remove()

for (Iterator<Excercise> it = z.iterator(); it.hasNext();) {
   Excercise e = it.next();
   if (condition) {
      z.remove();
   }
}