我在唯一的线程上运行以下代码:
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);
没有抛出异常。
为什么?
答案 0 :(得分:0)
只有你得到这个例外的原因是你的集合在循环/迭代中得到修改(我认为移动方法正在修改将在列表中反映的对象)。
解释为什么你在foreach中获得异常而不是在for:
foreach循环在内部使用迭代器。并且集合快速失败(立即报告失败),因此如果集合在循环中被修改,迭代器的next()方法将抛出异常。然而,正常的循环不使用迭代器,因此这是因为你没有在该循环中获得异常,但是存在其他副作用,即修改for循环,如大小变化或迭代变为无限。