我正在尝试迭代两个ArrayList:其中一个叫做“ gegner”是一个关于敌人的列表,另一个叫做“ waende”是关于墙壁的列表。

每当墙壁和敌人碰触时,两者都应失去一种耐久性/健康性。
由于无法同时使用,因此我创建了一个新方法,该方法应从列表中删除死亡对象。

我的想法是:

public void removeDeathObjects() {
    Wand tempW;
    Gegner tempG;
    for (Iterator<Gegner> it = gegner.iterator(); it.hasNext();) {
        tempG = it.next();
        for (Iterator<Wand> it2 = waende.iterator(); it2.hasNext();) {
            tempW = it2.next();

                if(tempW.isDestroyed()){
                    it2.remove();
                }
                if (tempG.isDeath()){
                    it.remove();
                }
        }

    }
}


但是,一旦至少有两堵墙,该程序就会在行it.remove() java.lang.IllegalStateException中引发“线程AWT-EventQueue-0”中的异常”,并且不会完全杀死敌人。

我哪里失败了?

如果您愿意,我可以给您完整的代码,但是它很长。

PS:对不起,英语不好

最佳答案

您的错误是您嵌套了两个完全独立的循环。查看您的代码,很明显waende上的内部循环与gegner上的外部循环无关:您对waende的操作不依赖于对gegner的任何检查。发生的情况是,当tempG.isDeath()为true时,it.remove()对于Wand中的每个waende重复执行。在迭代器上的第一次删除成功,但是第二次失败。

您需要做的是将两个循环分开:

public void removeDeathObjects() {
    Wand tempW;
    Gegner tempG;
    for (Iterator<Gegner> it = gegner.iterator(); it.hasNext();) {
        tempG = it.next();
        if (tempG.isDeath()){
            it.remove();
        }
    }
    for (Iterator<Wand> it2 = waende.iterator(); it2.hasNext();) {
        tempW = it2.next();
        if(tempW.isDestroyed()){
            it2.remove();
        }
    }
}

07-26 00:37