其实,我相信有一定经验的都已经知道了,把标题的“为什么”去掉读一遍,但是具体是为什么?今天本人跟进源码(jdk7)探了个究竟。注:这篇文章只介绍使用list.remove()抛出ConcurrentModificationException的原因,其它参数及异常不作介绍。
直入主题,首先我们来看下面这段出问题的代码
下面是运行结果
使用iterator.remove()是没有问题的,此处就不粘图了
由运行结果可知,抛异常的地方出现在iterator.next(),而且已经遍历完了“bvBody”,当尝试获取“cvBody”时抛了异常。根据异常第一行可知问题出在ArrayList的内部类Itr(也就是代码中的iterator)的checkForComodification()方法,下面是源码
简单明了,当modCount != expectdModCount时,抛出并发修改异常(记住这个点