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