0

我有这个 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();
                        }
                    }
                }
4

2 回答 2

4

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

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

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

于 2013-09-12T20:28:50.910 回答
2

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

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

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

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

于 2013-09-12T20:29:26.270 回答