问题描述
现在有这样一段代码:

问题定位

主要意思是这个变量,当集合更改就会变化,目的是防止外部通过迭代器改变集合,产生未预料到的后果。
2.exceptedModCount
Itr是在ArrayList中实现的迭代器方法。前往查看得知:
看起来,这个方法没有直接修改modCount和exceptedModCount变量的值,但是在开始执行使调用了可能产生异常的方法,因此可以肯定,是add(object e)方法出了问题。
可以看到,add(object e)方法执行时,会使得modCount+1,造成第二次使用next()方法时产生异常。
为什么会这样?
实际上,java中存在各种不同的容器(List,Set)因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作更为简单,Java引入了迭代器模式,把访问逻辑不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。
当迭代器工作的过程中,不允许集合擅自修改集合结构,如果修改了会导致modCount值变化,从而不会等于expectedModCount,那么迭代器就会抛出并发修改异常。本例中,相当于从外部通过迭代器试图修改集合结构,因此产生异常。
解决方案
1.使用迭代器遍历,使用迭代器添加元素
使用while循环、hasNext()与next()方法遍历元素
使用ListIteractor接口中的add(object e)方法添加元素(实际上ListIteractor添加了add方法)
改写的程序如下:
2.使用集合遍历,使用集合添加元素
使用for循环、size()方法与get()方法遍历元素
使用add()方法添加元素
文章评论