私有(private)ArrayList对象;
私有(private) ArrayList 删除;
私有(private)静态ArrayList BattleObjects;
私有(private)玩家玩家;
私有(private)静态int gameState;
公共(public)游戏(){
游戏状态 = 世界;
对象 = new ArrayList();
删除 = new ArrayList();
BattleObjects = new ArrayList();
玩家 = 新玩家(Display.getWidth()/2 - 玩家.SIZE/2, Display.getHeight()/2 - 玩家.SIZE/2);
对象.add(玩家);
object.add(new Circle(32, 32, 玩家));
object.add(new Imp(300, 100, 玩家));
}
公共(public)无效 getInput() {
玩家.getInput();
}
公共(public)无效更新(){
如果(游戏状态==战斗){
for (GameObject i : BattleObjects) {//**此处发生错误**
if (!i.isRemoved())
i.update();
别的
删除.添加(i);
}
}
别的 {
for (GameObject i : 对象) {
if (!i.isRemoved())
i.update();
别的
删除.添加(i);
}
}
对于(游戏对象 i:删除)
BattleObjects.remove(i);
}
这不是列表删除问题,因为我稍后使用另一个列表来删除代码中的对象,而每个循环的对象都不相同。我不太清楚为什么会发生这种情况。我检查了其他线程,它似乎对我的情况没有帮助。
最佳答案
您正在创建一个新的ArrayList
,并将要从第一个列表中删除的元素添加到此列表中。但您必须明白,当您定义数组
或List
时,您只是定义或声明该类型的引用。由于您要将第一个列表的元素添加到另一个列表(浅复制),因此两个列表都将具有在内部指向同一实例的元素。因此,无论您是否迭代一个集合并从其他相同的内部 Collection
中删除,都会被修改,因此您会得到 ConcurrentModificationException
。
现在您可以创建 List
的 Iterator
、迭代并删除,或者您也可以这样做
battleObjects.removeAll(remove);
关于java.util.ConcurrentModificationException 未列出删除错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22890203/