陷入“java.util.ConcurrentModificationException”

时间:2011-04-13 07:29:57

标签: java exception linked-list concurrentmodification

这是我的代码:

// eventList is a LinkedList

public void run() {

    Iterator<Event> it = eventList.iterator();
    int size = eventList.size();

    while(size > 0) {
        while(it.hasNext()) {
            Event e = it.next(); //flaged line

            if(e.ready()) {
                System.out.println(e);
                e.action();
                eventList.remove(e);
                --size;
            }
        }
    }
}

错误java.util.ConcurrentModificationException在标记为(Event e = it.next();)时抛出。你是否在我的代码中看到一个错误,这个错误明显是抛出异常的原因?

2 个答案:

答案 0 :(得分:17)

您在使用eventList进行迭代时正在修改eventList.remove()。您不能这样做,或Iterator变得无法使用。

只需将eventList.remove(e)替换为it.remove(),就可以了。

此外,如果您的某个事件在第一次运行中没有准备就绪,您可以很容易地遇到无限循环,因为it.hasNext()一旦返回true将永远不会返回false,但是size也不会被修改。一种解决方案是将整个Iterator it = ...移到第一个while循环中。

我还要修改外部while循环以使用while (!e.isEmpty()),而不是尝试手动跟踪eventList的大小。

答案 1 :(得分:1)

您应该通过迭代器删除元素,否则迭代器会被重置,因为底层集合已更改。