首页 > 解决方案 > 使用正确的 remove() 方法时显示 java.util.ConcurrentModificationException

问题描述

当 isActive 为假时,我试图删除一个实体。当实体属性 isActive 设置为 false 时,它​​进入 if 语句并删除实体,之后再次遍历实体列表然后崩溃。根据我的研究,我正在使用正确的方法从数组列表中删除对象。

删除实体并遍历列表时的代码是

    for (Entity entity : entities) {// itaarate through all the entities in list of entities

        entity.render(shader, camera, this);// render each entity

        if (!entity.isActive())// checks if entity attribute is active
            entities.remove(entity);// removes entity from list

    }

在从列表中删除实体后使用调试器时,它会返回到 for 循环的顶部,然后显示此页面

在此处输入图像描述

调试时的变量窗口

在此处输入图像描述

控制台中显示的完整错误是

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at project.World.render(World.java:196)
at project.Main.<init>(Main.java:152)
at project.Main.main(Main.java:167)

正在创建的列表是

public static ArrayList<Entity> entities; // contains all entities

标签: javaexceptionarraylistconcurrentmodification

解决方案


java.util.ConcurrentModificationException使用正确remove()方法时显示

实际上,您使用的是错误的方法。或者更准确地说remove()是错误对象上的方法。

您可以在迭代时删除元素......但您需要remove()在对象上使用该方法Iterator;有关更多详细信息,请参阅javadoc

Iterator<Entity> it = entities.iterator();
while (it.hasNext()) {
    Entity entity = it.next();
    entity.render(shader, camera, this);

    if (!entity.isActive()) {
        it.remove();
    }
}

请注意,这Iterator.remove()是一个可选操作,但ArrayList迭代器确实实现了它。

ListIteratorAPI 具有相同的方法,但更Iterator通用。(您可以将上述示例代码用于任何可以使用 迭代的类型Iterator,而不仅仅是List类型。)


推荐阅读