我正在尝试迭代两个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();
}
}
}