gpt4 book ai didi

java - 用于碰撞的嵌套迭代器循环导致 IllegalStateException

转载 作者:行者123 更新时间:2023-12-04 09:30:06 28 4
gpt4 key购买 nike

我有一个坦克射击弹药的游戏。我对这部分代码的目标是检查它们是否与“碰撞”磁贴发生碰撞,如果是,则将其和磁贴移除。
代码如下所示,每 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 语句 但我真的不知道如何防止它发生,因为我刚刚了解到 “迭代器”类(class)做到了。我通过诸如 this 之类的链接找到了如何编写上面的代码
可视化:
GIF 下面显示了它的样子。射击击中石头,然后在控制台中打印错误。然而,它应该移除镜头和瓷砖。
Tank shoots
我尝试了什么?
如果我删除 “迭代器.删除”它不会导致任何错误。瓷砖仍然会消失,但这是因为我有 "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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com