在嵌套循环中删除项时的ConcurrentModificationException

时间:2015-06-11 14:07:26

标签: java loops nested concurrentmodification

这是我的代码,当我删除元素时,我获得了ConcurrentModificationException。我不明白为什么itrGrupo1会因删除itrGrupo2中的元素而受到影响。

当第二个完成时,{:1}}发生异常。

Instancia inst1=(Instancia) itrGrupo1.next()

1 个答案:

答案 0 :(得分:0)

由于以下几行存在问题:

List grupo1=new ArrayList();
List grupo2=new ArrayList();
grupo1=(List) lstPrimeraAgrupacion.get(i);         
grupo2=(List) lstPrimeraAgrupacion.get(i);

此前两行创建了两个新的ArrayList,但跟在它们后面的行会使grupo1grupo2指向相同的现有列表。我认为这是grupo2所需要的,因为您正在修改它,看起来此代码所需的效果是修改lstPrimeraAgrupacion的{​​{1}}子列表。 (我假设ilstPrimeraAgrupacion,或List<List<Instancia>>个对象的子列表。)

代码正文的作用是查看Instancia与条件匹配的所有元素,然后将其从grupo1中删除。但是,如果这两个变量引用相同的grupo2对象,那么修改List<Instancia>也会改变grupo2上的迭代器可以访问的内容,从而可能使其处于破坏状态(这就是为什么你有例外)。

现在,有更好的方法来解决迭代列表和删除元素的问题,但是您设计代码的方式,影响最小的解决方案是简单地将元素复制到新的{ {1}},并将其用作旧列表的快照,同时根据需要从实际列表中删除元素。为此,您可以将以上代码更改为以下内容:

grupo1