java.util.ConcurrentModificationException 未列出删除错误

标签 java lwjgl

私有(private)ArrayList对象;
    私有(private) ArrayList 删除;

    私有(private)静态ArrayList BattleObjects;

    私有(private)玩家玩家;

    私有(private)静态int gameState;

    公共(public)游戏(){
        游戏状态 = 世界;

        对象 = new ArrayList();
        删除 = new ArrayList();

        BattleObjects = new ArrayList();

        玩家 = 新玩家(Display.getWidth()/2 - 玩家.SIZE/2, Display.getHeight()/2 - 玩家.SIZE/2);

        对象.add(玩家);
        object.add(new Circle(32, 32, 玩家));
        object.add(new Imp(300, 100, 玩家));
    }

    公共(public)无效 getInput() {
        玩家.g​​etInput();
    }

    公共(public)无效更新(){
        如果(游戏状态==战斗){
            for (GameObject i : BattleObjects) {//**此处发生错误**
                if (!i.isRemoved())
                    i.update();
                别的
                    删除.添加(i);
            }
        }
        别的 {
            for (GameObject i : 对象) {
                if (!i.isRemoved())
                    i.update();
                别的
                    删除.添加(i);
            }
        }

        对于(游戏对象 i:删除)
            BattleObjects.remove(i);
    }

这不是列表删除问题,因为我稍后使用另一个列表来删除代码中的对象,而每个循环的对象都不相同。我不太清楚为什么会发生这种情况。我检查了其他线程,它似乎对我的情况没有帮助。

最佳答案

您正在创建一个新的ArrayList,并将要从第一个列表中删除的元素添加到此列表中。但您必须明白,当您定义数组List时,您只是定义或声明该类型的引用。由于您要将第一个列表的元素添加到另一个列表(浅复制),因此两个列表都将具有在内部指向同一实例的元素。因此,无论您是否迭代一个集合并从其他相同的内部 Collection 中删除,都会被修改,因此您会得到 ConcurrentModificationException

现在您可以创建 ListIterator、迭代并删除,或者您也可以这样做

battleObjects.removeAll(remove);

关于java.util.ConcurrentModificationException 未列出删除错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22890203/

相关文章:

java - 在 Ubuntu 终端中运行 Java .class 文件时出现 ClassNotFound 错误

java - 缺少返回语句错误(基于引用的列表)

java - LWJGL Display.update() 自动将 FPS 限制在 60

java 从字符串中获取键码

java - 启动 Java 程序时 Eclim 忽略 native 库路径

java - 如何使用 .jar 中打包的 .png 数据作为 LWJGL 中的纹理?

java - 重新绘制我的 JFrame

java - 为什么双参数化函数接受 float 而不是相反?

java - 在 JFrame 中绘制多条线(最小 9x9)

java - 使用java 2D图形旋转的黑色区域?