List迭代时报ConcurrentModificationException异常

简介:

查看源代码我们可以发现,List中有个modCount字段,如果在迭代过程中该字段修改了就会报ConcurrentModificationException异常。

下面看看相关源代码

wKiom1XxbGSQG4e_AAViuYUvjKw407.jpg


wKioL1XxbqSC9bcRAAEs0pAU6Wk356.jpg

初始状态下,modCount的值是0,在迭代开始时expectedModCount的值也为0,如果在迭代过程中删除了某个元素,此时modCount++后,modCount的值就变成1,那么下次迭代(调用next方法)时,会先调checkForComodification方法检查modCount和expectedModCount是否相等,显然此时二者不相等,于是抛异常。


下面是测试代码

wKiom1XxbW7yZyF6AAONRmuOP9w194.jpg


细心的读者会发现,上述代码中,当等于A或者C的时候删除会抛异常,而等于B时删除时不会抛异常,其实这是个巧合。因为,第一次迭代时删除A后,cursor=1,size=2,于是进入下一轮迭代,于是在next中检测到modCount与expectedModCount不相等,抛异常。而假设等于B的时候删除,那么当进行第二次迭代删除B以后,cursor=2,size=2,cursor与size相等,所以hasNext()方法返回false,于是不再进行迭代,所以没有机会报错。


本文转自   手不要乱摸  51CTO博客,原文链接:http://blog.51cto.com/5880861/1693563
相关文章
避免list中remove导致ConcurrentModificationException
避免list中remove导致ConcurrentModificationException
46 0
|
缓存 监控 Java
游戏服务器开服异常Check List
游戏服务器开服异常Check List
58 0
|
Java 数据格式 Spring
SpringBoot中@Value注解注入List或Map数据格式出现异常
在做一个小demo的时候、做的例子是我想在程序运行时将一些数据放入到配置类中的属性中、我想到可以通过yaml配置的数据映射到实体类中的属性中、我在想通过这种形式能不能映射。
|
索引 Python
Python:list列表迭代使用range和enumerate获取元素和索引
Python:list列表迭代使用range和enumerate获取元素和索引
170 1
for-each或迭代器中调用List的remove方法会抛出ConcurrentModificationException的原因
for-each循环遍历的实质是迭代器,使用迭代器的remove方法前必须调用一下next()方法,并且调用一次next()方法后是不允许多次调用remove方法的,为什么呢?接下来一起来看吧
74 0
一个关于List的IndexOutOfBoundsException异常记录
一个关于List的IndexOutOfBoundsException异常记录
116 0
|
SQL 关系型数据库 MySQL
解决Mysql5.7以上版本, 使用group by抛出Expression #1 of SELECT list is not in GROUP BY clause and contains no异常
解决Mysql5.7以上版本, 使用group by抛出Expression #1 of SELECT list is not in GROUP BY clause and contains no异常
132 0
避免list的并发修改异常的几种方式
避免list的并发修改异常的几种方式
有关使用Arrays.asList(array) 转换成List集合之后,对其进行操作抛出UnsupportedOperationException异常的问题
有关使用Arrays.asList(array) 转换成List集合之后,对其进行操作抛出UnsupportedOperationException异常的问题
108 0
|
5月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
958 1