坚持"java.util.ConcurrentModificationException"



下面是我的代码:

// 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();)处抛出。您是否在我的代码中看到了一个错误,使抛出异常的原因变得明显?

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

eventList.remove(e)替换成it.remove()就可以了。

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

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

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

相关内容

  • 没有找到相关文章

最新更新