解决 Java.util.ConcurrentModificationException 异常

41 阅读1分钟

解决 Java.util.ConcurrentModificationException 异常

问题描述

在迭代集合元素时,如果对集合做 add/remove 操作,会抛出 java.util.ConcurrentModificationException 异常。

原因分析

在集合中,如 ArrayList,对它的做出修改操作(add/remove)时都会对 modCount 这个字段 +1,modCount 可以看作一个版本号,每次集合中的元素被修改后,都会 +1(即使溢出)。最后调用 checkForComodification() 方法来校验 modCountexpectedModCount 是否相等,迭代结束后进行 count 对比,不一样就会抛出该异常。

注意:因为 foreach 实现原理是转换为 Iterator.next() 来执行的。既然调用了 Iteratornext() 方法,必然需要通过 checkForComodification() 方法来校验 modCount 是否等于 expectedModCount

解决方案

方法 1

不要通过 list.remove(s) 来移除元素,而是 iter.remove(),这样就没有了。

方法 2

另外准备一个 list 用来保存需要移除的元素,在迭代完毕后一次性移除即可。

以上方法可以有效避免 java.util.ConcurrentModificationException 异常的发生。