陷入“java.util.ConcurrentModificationException”

发布于 2024-11-01 03:22:29 字数 613 浏览 5 评论 0原文

这是我的代码:

// 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();)处抛出。您是否发现我的代码中存在一个错误,该错误清楚地表明了引发该异常的原因?

Here is my code:

// 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;
            }
        }
    }
}

The error java.util.ConcurrentModificationException is thrown at the flag lined (Event e = it.next();). Do you see a mistake in my code that makes obvious the reason of that exception to be thrown?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

薔薇婲 2024-11-08 03:22:29

您正在修改 eventList,同时使用 eventList.remove() 进行迭代。您不能这样做,否则 Iterator 将变得不可用。

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

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

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

Your are modifying eventList while using eventList.remove() while iterating over it. You must not do this, or the Iterator becomes unusable.

Simply replace eventList.remove(e) with it.remove() and it should be fine.

Also, you can easily run into an endless loop if one of your events isn't ready in the first run because it.hasNext() will never return true once it returned false, but size won't be modified either. One solution would be to move the whole Iterator it = ... line inside the first while loop.

I'd also modify the outer while loop to use while (!e.isEmpty()) instead of trying to track the size of eventList manually.

美男兮 2024-11-08 03:22:29

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

You should remove the element through the iterator, otherwise the iterator gets reset because the underlying collection changed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文