我有以下代码:
class Action {
public void step(Game game) {
//if some condition met,
// then remove self from action stack
game.actionStack.remove(this);
}
class Game (
public ArrayList<Action> actionStack;
public Game() {
actionStack = new Arraylist<Action>();
actionStack.add(new Action());
while (true) {
for (Action action : this.actionStack) {
action.step(this);
}
}
}
}
game.actionStack.remove(this);
发生时会引发异常。有没有办法像我想要的那样从Action
类内部安全地删除元素? 最佳答案
我猜您正在收到ConcurrentModificationException,因为您在迭代时调用了列表删除方法。你不能那样做。
一个简单的解决方法是在迭代时处理数组的副本:
for (Action action : new ArrayList<>(this.actionStack)) {
action.step(this);
}
一种更有效的解决方案是使用显式Iterator并调用其remove方法。也许
step()
返回一个布尔值,指示它是否要保留在下一步列表中:for (Iterator<Action> it = this.actionStack.iterator(); it.hasNext();) {
Action action = it.next();
if (!action.step(this)) {
it.remove();
}
}