7

这是我的代码:

// 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();) 处引发。您是否在我的代码中看到一个错误,该错误使引发该异常的原因显而易见?

4

2 回答 2

17

eventList在使用时进行修改,同时eventList.remove()对其进行迭代。您不能这样做,否则Iterator将无法使用。

只需替换eventList.remove(e)it.remove(),它应该没问题。

此外,如果您的某个事件在第一次运行时没有准备好,您很容易陷入无限循环,因为一旦返回it.hasNext()就永远不会返回,但也不会被修改。一种解决方案是将整行移动到第一个循环内。truefalsesizeIterator it = ...while

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

于 2011-04-13T07:32:56.377 回答
1

您应该通过迭代器删除元素,否则迭代器会因为基础集合更改而重置。

于 2011-04-13T07:33:52.323 回答