其实,我相信有一定经验的都已经知道了,把标题的“为什么”去掉读一遍,但是具体是为什么?今天本人跟进源码(jdk7)探了个究竟。注:这篇文章只介绍使用list.remove()抛出ConcurrentModificationException的原因,其它参数及异常不作介绍。
直入主题,首先我们来看下面这段出问题的代码

下面是运行结果

使用iterator.remove()是没有问题的,此处就不粘图了
由运行结果可知,抛异常的地方出现在iterator.next(),而且已经遍历完了“bvBody”,当尝试获取“cvBody”时抛了异常。根据异常第一行可知问题出在ArrayList的内部类Itr(也就是代码中的iterator)的checkForComodification()方法,下面是源码

简单明了,当modCount != expectdModCount时,抛出并发修改异常(记住这个点)。那么,modCount和expectedModCount分别是什么?modCount在ArrayList中的定义如下,简单理解就是记录改变了ArrayList的size(增删操作)的次数

最低0.47元/天 解锁文章
1240





