【问题标题】:java.util.ConcurrentModificationException Cant fixjava.util.ConcurrentModificationException 无法修复
【发布时间】:2014-05-18 21:40:01
【问题描述】:
public Game() {
        gameState = OVERWORLD;

        objects = new ArrayList<GameObject>();
        remove = new ArrayList<GameObject>();

        battleObjects = new ArrayList<GameObject>();
        battleRemove = new ArrayList<GameObject>();

        player = new Player(Display.getWidth() / 2 - player.SIZE / 2, Display.getHeight() / 2 - player.SIZE / 2);

        objects.add(player);
        objects.add(new Circle(32, 32, player));
        objects.add(new Imp(300, 100, player));
    }


public void update() {
            if (gameState == BATTLE) {
                for (GameObject i : battleObjects) {
                    if (!i.isRemoved())
                        i.update();
                    else
                        battleRemove.add(i);
                }
            }
            else {
                for (GameObject i : objects) {
                    if (!i.isRemoved())
                        i.update();
                    else
                        remove.add(i);
                }
            }
        }

        public void render() {
            if (gameState == BATTLE) {
                for (GameObject i : battleObjects)
                        i.render();
            }
            else {
                for (GameObject i : objects)
                    i.render();
            }
        }

        public static void createNewBattle(Player p, Monster m) {
            battleObjects.add(p);
            battleObjects.add(m);

            gameState = BATTLE;
        }

我完全理解为什么会发生这种情况,但我终其一生都无法找到解决问题的方法...谁能帮助我???我在这里坐了几个小时,试图找到另一种方法。我只是想用战斗对象创建一个数组。

【问题讨论】:

  • 我对 GameObject 类(尤其是这个“isRemoved”方法)很好奇。为什么你需要将一个对象(重新)移动到一个单独的集合中?
  • 在我的游戏中,有一个物品可以被拾取,从而设置一个标志来从世界中移除该对象并将其放置在玩家库存中。它就像一个带有随机战斗的口袋妖怪角色扮演游戏,所以我创建了一个单独的战斗数组列表,用于仅渲染和更新战斗中的对象

标签: java arraylist lwjgl


【解决方案1】:

修改集合的唯一安全方法是使用迭代器的 remove 方法,因此使用迭代器而不是 for each 就可以了: Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop

【讨论】:

  • 我试过这个错误主要来自更新/删除battleObjects的for循环。
  • 我猜你更新方法可能试图做一些改变对象列表的事情。在 for each 中,您不能修改对象集合。
  • 怪物更新调用createNewBattle方法改变游戏状态并将怪物和玩家添加到战斗对象中。
  • 对,这就是你不能使用 for each... 你不能将新元素添加到对象中或从中删除元素。您可以创建一个二级列表,其中包含要在每个之后添加的对象。在这里查看:stackoverflow.com/questions/993025/…
  • "用你想要迭代的元素构建一个队列怎么样;当你想添加元素时,将它们排入队列的末尾,并继续删除元素直到队列为空。这个这就是广度优先搜索通常的工作方式。”我不太确定他在说什么。
猜你喜欢
  • 2013-11-08
  • 2016-11-17
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多