编程语言
首页 > 编程语言> > Java 错误ConcurrentModificationException思考分析

Java 错误ConcurrentModificationException思考分析

作者:互联网

在使用list集合时,如果我们使用迭代器进行遍历,同时在遍历过程中尝试添加元素,运行后会爆出这样的错误

 

 

 源码是这样的

 

 

 按理说没有什么问题,为什么会报错?复制报错信息到API文档中

当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。

某些迭代器实现(包括由JRE提供的所有通用集合实现的实现)可能会选择在检测到此行为时抛出此异常

某些迭代器实现:迭代器实现,迭代器是个接口,

再看错误信息

at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)

Arraylist中的某个checkForComodification方法

Arryaylist中的next方法

ctrl+b进入源码

at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)点击(ArrayList.java:909)

我们会看到这样的一串代码,可以看到这个if判断

modCount != expectedModCount,某个变量和这个变量相等抛出异常ConcurrentModificationException
final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }

这个变量是什么?我们现在好不清楚

先看看这个at java.util.ArrayList$Itr.next(ArrayList.java:859)点击ArrayList.java:859

public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

似乎也不是很懂,但是我们能直到这是next的构造方法,我们仔细看会有个东西是这个

checkForComodification()

和上面的正好对应上了,说明上面是个方法,也就是上面的运行错误影响了下面的错误,一环套一环

回去我们看上面的

final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }

在中间我们看到了中间的判断

if (modCount != expectedModCount)
                throw new ConcurrentModificationException();

modCount != expectedModCount,百度是这样回答的 modCount字面意思就是修改次数

expectedModCount

expectedModCount则是表示迭代器对集合进行修改的次数

也就是说这两个次数不相等就会抛出throw异常

那这个modCount为什么会不相等,我们在源码中寻找modCount,选中modCount按CTRL+B

protected transient int modCount = 0;    

int  

 

标签:java,ConcurrentModificationException,ArrayList,modCount,checkForComodification,
来源: https://www.cnblogs.com/521521cm/p/14349770.html