我有这个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();
}
}
}
答案 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
的防御副本或该方法的任何内容),那么您实际上是修改您正在迭代的同一个容器,但使用不同的引用。这就是你得到那个例外的原因。
因此,您还应该将外部循环更改为使用迭代器。