【问题标题】:java.util.ConcurrentModificationException - How do I delete using an iterator [duplicate]java.util.ConcurrentModificationException - 如何使用迭代器删除 [重复]
【发布时间】:2017-06-26 01:18:02
【问题描述】:

使用以下代码将生成java.util.ConcurrentModificationException

final AnimationTimer timer = new AnimationTimer() {
    @Override
    public void handle(long timestamp) {


        for (ListIterator<myCircle> List = CircleList.listIterator(); List.hasNext(); ) {
            myCirle check = List.next();

            if (CheckCollisionFunction(check) == true) {
                this.stop();
                CircleList.clear();
                gameOverFunction();
            }
        }
    }
} 

所以我使用迭代器来检查我的任何圈子是否与我的玩家圈子发生冲突。

当我清除列表时:

CircleList.clear();

我得到了例外。

java.util.ConcurrentModificationException

当您使用迭代器时,有时会在迭代器之外删除。有人可以告诉我如何使用迭代器删除列表中的所有内容吗?

或另一种阻止此错误的方法。

这是我的清单。

private final ObservableList<myCircle> CircleList = FXCollections.observableArrayList();

【问题讨论】:

  • 你从哪里调用 clear()?没有理由通过迭代器一个一个地删除元素。完成对 List 的迭代后,您只需调用 clear()。
  • final AnimationTimer timer = new AnimationTimer() { @Override public void handle(long timestamp) { 一切都在这个计时器中,但我也使用 this.stop();停止动画计时器。
  • 您是否从与遍历列表的线程不同的线程中清除列表?这可以解释异常。
  • 已编辑以显示所有内容都在同一个地方。我还在同一个计时器下使用两个迭代器。一个检查墙壁碰撞,一个检查圆形碰撞,这可能是个问题吗?我可以把它们放在同一个迭代器中,我不知道为什么我还没有。

标签: java javafx iterator


【解决方案1】:

只需在gameOverFunction(); 之后插入break; 即可停止迭代器。

问题是你清除了列表,但迭代器继续,在下一次next()调用时会抛出异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 2021-03-01
    • 2015-01-14
    • 2011-12-27
    • 2011-04-23
    • 2020-05-21
    • 2013-06-02
    相关资源
    最近更新 更多