【问题标题】:Why does my iterator.next result in a ConcurrentModificationException?为什么我的 iterator.next 会导致 ConcurrentModificationException?
【发布时间】:2015-09-15 04:37:45
【问题描述】:

我正在制作一个游戏,你作为玩家吃点...这些点随机生成,当玩家覆盖这些点时,它们应该被移除。为此,我使用了一个迭代器。

ArrayList<Dot> dots = new ArrayList<Dot>();
Iterator<Dot> i = dots.iterator();

public Game(){
    MouseHandler.mouse = new MouseHandler();
    Player.player = new Player(40, 40);

    for(int i = 0; i < 20; i++){
        dots.add(new Dot());
    }
}

public void update(){
    Player.player.update();

    while(i.hasNext()){
        Dot current = i.next();
        if(Player.player.getCircle().intersects(current.getCircle())){
            i.remove();
        }
    }

}

执行此操作时,我会在Dot current = i.next(); 获得ConcurretModificationException

这个问题的原因是什么,为什么会发生?

-真诚的亨利克

编辑:很抱歉,我只是想让代码更短、更易读。

EDIT2:谢谢大家...问题是我在创建迭代器之前没有向集合中添加任何内容。感谢大家的帮助!

【问题讨论】:

  • 使用 I.remove() 代替。
  • 因为您正在修改您正在遍历列表而不是迭代器的列表。
  • 不,这不是问题...使用 i.remove 不起作用
  • @Devtons 那么您需要提供更多信息,因为您正在做的事情会导致该错误,而通过迭代器将其删除则不会。
  • 请编写可以编译的代码。您的代码在语法上无效(在某个其他方法的中间有一个 ctor,或者在执行删除的代码周围缺少一个方法)。

标签: java arraylist while-loop iterator


【解决方案1】:

您正在初始字段分配中创建迭代器,这可能发生在您向构造函数中的集合添加任何内容之前。

删除迭代器字段,只调用dots.iterator(),分配给局部变量,紧接在while循环之前。

【讨论】:

  • 顺便说一句,即使您没有删除项目,您也会在迭代器作为成员变量的方法中发现一个问题:在您调用 update 的第二次(以及后续)时间,迭代器将被耗尽,因此调用将是空操作。
【解决方案2】:

您收到异常是因为您直接修改集合而不是通过迭代器。

您可以改用i.remove() 从迭代器中删除。

【讨论】:

  • 我得到相同的 ConcurrentModificationException
猜你喜欢
  • 2011-08-29
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2020-11-08
  • 1970-01-01
相关资源
最近更新 更多