一、出现原因案例
需求:
按照正确的思路却写出有问题的程序(在Interator遍历时用List的add方法添加)
错误提示是ConcurrenModificationException,我们来看这个类:
此异常继承自RuntimeException所以这是一个运行时异常
看这个异常提示:
根据异常提示可知,错误应该出现在ArrayList的内部类Itr中的next方法中调用的checkForComodification方法
为了分析错误我们返回去看我们创建List集合那一行代码:
首先看List接口,后边程序中用了他里边的iterator方法和add方法
我们也new了一个ArrayList集合类的对象,所以看一下List接口中的iterator方法、add方法以及看一下ArrayList类
List接口:
ArrayList类:
可以看出他继承了一个类并且实现了一个接口
实现接口就说明他重写了里边的方法
重写的方法如下:
程序出问题时候是在next方法下出的问题,按照底层走的是ArrayList的内部类Itr下的next方法
next方法里首先就调用了checkForComdification方法
方法里做了一个判断,如果那两个值不相等就抛出并发异常
modCount: 集合修改的次数。
exceptionModCount: 集合预期修改的次数。
在创建Itr后的第一行就声明了这两个值相等:
可以看出这两个值本来应该是相等的,但是在程序中判断有“world”,并且调用了add方法,再来看重写的add方法
所以导致预期修改值和实际修改值不相等出现并发异常。
二、如何解决?
因为ArrayList集合中的get方法没有modCount++
所以这样就可以了