为什么我的iterator.next导致ConcurrentModificationException?

时间:2015-06-28 18:42:42

标签: java arraylist while-loop iterator

我正在做一个游戏,你作为一个玩家吃点...这些点随机产生,当玩家覆盖点时,他们应该被删除。要做到这一点,我使用的是迭代器。

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();
        }
    }

}

执行此操作时,我会在ConcurretModificationException

获得Dot current = i.next();

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

- 真诚的亨里克

编辑:很抱歉这么麻烦,我只是想让代码更短,更易读。

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

2 个答案:

答案 0 :(得分:1)

您正在获取异常,因为您是直接修改集合而不是通过迭代器。

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

答案 1 :(得分:1)

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

删除迭代器字段,然后在while循环之前立即调用dots.iterator(),分配一个局部变量。