java ArrayList中的ConcurrentModificationException

时间:2015-05-31 15:07:20

标签: java exception arraylist

我在唯一的线程上运行以下代码:

ArrayList<Ball> allBalls; 
ArrayList<Ball> toRemove = new ArrayList<Ball>();

for (Ball ball:allBalls) { //Exception thrown here
    ball.move();

    if (shouldRemove(ball)) {
        toRemove.add(ball);
    }
}               
allBalls.removeAll(toRemove);       
toRemove.removeAll(toRemove);

有时会抛出

java.util.ConcurrentModificationException
  at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:576)

但是当我更换这一行

for (Ball ball:allBalls) {

由此

for (int i=0; i<allBalls.size();i++) {
    Ball ball = allBalls.get(i);

没有抛出异常。

为什么?

1 个答案:

答案 0 :(得分:0)

只有你得到这个例外的原因是你的集合在循环/迭代中得到修改(我认为移动方法正在修改将在列表中反映的对象)。

解释为什么你在foreach中获得异常而不是在for:

foreach循环在内部使用迭代器。并且集合快速失败(立即报告失败),因此如果集合在循环中被修改,迭代器的next()方法将抛出异常。然而,正常的循环不使用迭代器,因此这是因为你没有在该循环中获得异常,但是存在其他副作用,即修改for循环,如大小变化或迭代变为无限。