Java ConcurrentModificationException异常原因和解决方法
Posted 江寒雪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java ConcurrentModificationException异常原因和解决方法相关的知识,希望对你有一定的参考价值。
在前面一篇文章中提到,对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。下面我们就来讨论以下这个异常出现的原因以及解决办法。
一.ConcurrentModificationException异常出现的原因
先看下面这段代码:
1 2 3 4 5 6 7 8 9 10 11 12 |
public
class
Test
public
static
void
main(String[] args)
ArrayList<Integer> list =
new
ArrayList<Integer>();
list.add(
2
);
Iterator<Integer> iterator = list.iterator();
while
(iterator.hasNext())
Integer integer = iterator.next();
if
(integer==
2
)
list.remove(integer);
|
运行结果:
从异常信息可以发现,异常出现在checkForComodification()方法中。
我们不忙看checkForComodification()方法的具体实现,我们先根据程序的代码一步一步看ArrayList源码的实现:
首先看ArrayList的iterator()方法的具体实现,查看源码发现在ArrayList的源码中并没有iterator()这个方法,那么很显然这个方法应该是其父类或者实现的接口中的方法,我们在其父类AbstractList中找到了iterator()方法的具体实现,下面是其实现代码:
1 2 3 |
public
Iterator<E> iterator()
return
new
Itr();
|
从这段代码可以看出返回的是一个指向Itr类型对象的引用,我们接着看Itr的具体实现,在AbstractList类中找到了Itr类的具体实现,它是AbstractList的一个成员内部类,下面这段代码是Itr类的所有实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
private
class
Itr
implements
Iterator<E>
int
cursor =
0
;
int
lastRet = -
1
;
int
expectedModCount = modCount;
public
boolean
hasNext()
return
cursor != size();
public
E next()
checkForComodification();
try
E next = get(cursor);
lastRet = cursor++;
Java ConcurrentModificationException异常原因和解决方法
|