我有一个坦克发射弹药的游戏。我这部分代码的目标是检查它们是否与“碰撞”图 block 发生碰撞,如果是,则将其和图 block 一起删除。
代码如下所示,每 1/60 秒检查一次:
Iterator<Shot> iterator = shots.iterator();
while(iterator.hasNext()) {
Shot tempShot = iterator.next();
tempShot.moveShot();
Iterator<Tile> tileIterator = tiles.iterator();
while(tileIterator.hasNext()) {
Tile tile = tileIterator.next();
if(tile.getHitbox().intersects(tempShot.getHitbox()) && tile.isHardObject()) {
tileIterator.remove();
iterator.remove();
}
}
}
我不知何故收到错误:线程“main”java.lang.IllegalStateException中出现异常。我预测这是由于 if 语句 导致的,但我真的不知道如何防止它发生,因为我刚刚了解了 "Iterator" 类的作用。我通过this等链接找到了如何编写上面的代码
可视化:
下面的GIF显示了它的外观。射击击中石头,然后在控制台中打印错误。然而,它应该移除镜头和瓷砖。
我尝试了什么?
如果我删除“iterator.remove”,它将不会导致任何错误。磁贴仍然会消失,但这是因为我在代码中添加了 "tileIterator.remove()" 。只有在取出弹药时才会发生“错误”。这让我相信 if 语句中发生了一些奇怪的事情。另外,有时似乎有效,有时则无效..
堆栈跟踪:
Exception in thread "main" java.lang.IllegalStateException
at java.base/java.util.ArrayList$Itr.remove(ArrayList.java:979)
at com.dubstepzedd.tankgame.entities.Player.fire(Player.java:159)
at com.dubstepzedd.tankgame.entities.Player.tick(Player.java:53)
at com.dubstepzedd.tankgame.Application.tick(Application.java:65)
at com.dubstepzedd.tankgame.GameLoop.loop(GameLoop.java:63)
at com.dubstepzedd.tankgame.GameLoop.run(GameLoop.java:37)
at java.base/java.lang.Thread.run(Thread.java:832)
at com.dubstepzedd.tankgame.GameLoop.main(GameLoop.java:104)
最佳答案
如果您已经删除了该项目,则 Iterator.remove
方法将引发此异常。鉴于代码的结构,异常似乎很可能来自 iterator.remove()
,这意味着您已经从 shots
中删除了当前项目,并且正在尝试再次删除它。
我不知道这段代码应该做什么,但也许打破内部循环,以便您从 shots
转到下一个项目是正确的事情。
if (tile.getHitbox().intersects(tempShot.getHitbox()) && tile.isHardObject()) {
tileIterator.remove();
iterator.remove();
break; // get next item from shots iterator
}
关于java - 嵌套迭代器循环发生冲突会导致 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62884721/