我有以下代码:

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

10-02 00:49
查看更多