使用迭代器时出现ConcurrentModificationException

时间:2013-09-12 20:26:23

标签: java iterator

我有这个java代码迭代对象的ArrayList并从中删除一些记录,但我有一个ConcurrentModificationException,这是我的代码。

for (ServiceWorkFlowStepModel s : svcModel.getServiceModel().getWorkFlowSteps()) {
                    if (s.getStepOrder().equals(stepIndex + 1)) {
                        svcModel.getServiceModel().getWorkFlowSteps().remove(s);
                    }
                    Iterator<ActivityModel> iter = activities.iterator();
                    while (iter.hasNext()) {
                        ActivityModel am = iter.next();
                        if (am.getComponentModel().getComponenetId().equals(s.getComponentId())) {
                            iter.remove();
                        }
                    }
                }

2 个答案:

答案 0 :(得分:4)

for-each循环构建在迭代器上,下面的代码在迭代时修改你的集合,这就是你得到ConcurrentModificationException的原因。

if (s.getStepOrder().equals(stepIndex + 1)) {
                        svcModel.getServiceModel().getWorkFlowSteps().remove(s);
              }

解决此问题的一种方法是使用iterator代替for-each并在迭代器上调用remove(),就像在代码的后续部分中所做的那样。

答案 1 :(得分:2)

我猜这个问题不在迭代器中,而是在if块中:

if (s.getStepOrder().equals(stepIndex + 1)) {
    svcModel.getServiceModel().getWorkFlowSteps().remove(s);
}

如果您的方法svcModel.getServiceModel().getWorkFlowSteps()返回对同一容器的引用(我的意思是,如果您没有返回list的防御副本或该方法的任何内容),那么您实际上是修改您正在迭代的同一个容器,但使用不同的引用。这就是你得到那个例外的原因。

因此,您还应该将外部循环更改为使用迭代器