5

我遍历一个 ArrayList。如果我使用旧时尚方式:

for (int i = 0; i < list.size(); i++)
{
    list.get(i).update();;
}

它运行正常。但是有了这个:

for (Baseitem item : list)
{
    item.update();
}

它在 ArrayList 类内部的第一行失败:线程“AWT-EventQueue-0”中的异常 java.util.ConcurrentModificationException 是的,在外部我确实删除了项目 - 但在迭代时肯定不会。如何解决这个问题?我不使用任何线程。

4

3 回答 3

14

您应该避免在迭代列表时修改列表中的元素。

使用for (int i...)循环,您不会迭代列表,因此您可以修改里面的元素。

for (Baseitem item : list)循环中,您正在迭代列表,因此对列表元素的修改将引发ConcurrentModificationException异常。

如果要修改其中的元素,则必须使用循环的第一种形式。

于 2013-06-12T14:08:26.537 回答
2

This happened to me because I was iterating through a list for removing all the items, with a for loop.

Example clients : [1, 2, 3]

for(int i=0 ; i<clients.size() /* 3 */ ; i++)
    clients.remove(clients.get(i));

i is going to be 0, 1 and 2, but at the third iteration (i=2) there will be no clients[2], thence ConcurrentModificationException.


How to avoid the problem:

while(clients.size() > 0)
    clients.remove(0);
于 2014-07-29T09:23:07.413 回答
1

关于 for-each 的重要说明:

for-each 循环用于集合和数组。它旨在简化最常见的迭代形式,其中迭代器或索引仅用于迭代,而不用于任何其他类型的操作,例如删除或编辑集合或数组中的项目。当有选择时,应该优先使用 for-each 循环而不是 for 循环,因为它增加了易读性。

在您的情况下,最好使用迭代器。

你也可以发布update()方法Baseitem吗?

于 2013-06-12T14:12:12.740 回答