最近在项目中调用remove方法缺抛出了ConcurrentModificationException异常。这其实是个老毛病,从源码角度来分析一下为什么在循环中调用remove方法会出现这样的问题。
简单调用remove方法时却抛出了如下异常
根据程序代码进一步查看ArrayList的源码。
可以看到每次对List进行操作的时候,都会有一个modCount == expectedModCount的操作,如果不等于则就会抛出ConcurrentModificationException异常。那这个modCount和expectedModCount到底是什么呢?再仔细深究源码,发现在Itr类中对这两个有着具体的定义。查看源码
在源码中cursor是下一个返回的元素的下标,lastRet是最后一个返回的元素的索引下标,expectedModCount是对ArrayList修改次数的预期的数值。而modCount是ArrayList继承自AbstractList的一个成员变量,表示对List的修改次数。remove方法的具体实现:
在这里调用了 ArrayList.this.remove(lastRet) 在iterator中,其expectedModCount值为0,cursor值为1,lastRet值为0,而List其modCount为1。那么在下一次调用checkForComodification()时 modCount!=expectedModCount就会抛出ConcurrentModificationException异常。
java循环时调用remove抛出java.util.ConcurrentModificationException异常
最新推荐文章于 2024-06-19 08:22:28 发布