java - 嵌套迭代器循环发生冲突会导致 IllegalStateException

标签 java iterator illegalstateexception

我有一个坦克发射弹药的游戏。我这部分代码的目标是检查它们是否与“碰撞”图 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显示了它的外观。射击击中石头,然后在控制台中打印错误。然而,它应该移除镜头和瓷砖。

Tank shoots

我尝试了什么?

如果我删除“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/

相关文章:

java - 在 Java 中使用日历 API 时性能不佳

c++ - 测试两个迭代器是否来自同一个对象

java - 此java代码是否有可能出现ClassCastException/IllegalStateException?

java - 如何正确地从 HTTPS 页面重定向?

java - 用于车牌的 Opencv 图像分割

java - 在 Java 中使用单个 for-each 循环遍历多个列表

android - Android 中的 IllegalStateException

android - startForegroundService() 在 Oreo 中抛出 IllegalStateException on app BOOT_COMPLETED

java - 如何从原始列表类中获取给定子类的元素列表?

java - 在嵌套 while 循环中将迭代器位置重置为 0