【问题标题】:trying to avoid Concurrent Modification Exception试图避免并发修改异常
【发布时间】:2016-07-14 05:57:37
【问题描述】:

我正在尝试避免并发修改异常。我遍历一个实体 HashMap 以 tick() 每个实体。玩家实体使用 WASD 输入在屏幕上移动,并在玩家向右移动时测试 addNewEntity() 方法我调用 GameState.addNewEntity(new Explosion(true, this.x, this.y));。播放器上出现几次爆炸,然后出现错误。玩家类扩展了扩展实体的生物。 Explosion 扩展了 Entity 类。

这段代码来自我的 GameState 类:

private static HashMap<Integer, Entity> entities = new HashMap<Integer, Entity>();
private static HashMap<Integer, Entity> newEntities = new HashMap<Integer, Entity>();

player = new Player(game, true, 100, 100);
entities.put(0, player);

我的 tick() 方法:

public void tick() {
    // add new elements from newEntities to entities, deleting from newEntities
    for (Entry<Integer, Entity> entry : newEntities.entrySet()) { 
        entities.put(entities.size(), entry.getValue());
        newEntities.remove(entry.getValue());
    }

    System.out.println(entities.size());

    // tick the updated entities HashMap
    for (Entry<Integer, Entity> entry : entities.entrySet()) { 
        entry.getValue().tick();

        // remove dead entities
        if (!entry.getValue().isAlive) {
             entities.remove(entry.getKey());
        }
    }
}

我的 addNewEntity 方法:

public static void addNewEntity(Entity e) {
    // add a new element to newEntities. 
    newEntities.put(newEntities.size(), e);
}

我的渲染方法:

public void render(Graphics g) {
    for (Entry<Integer, Entity> entry : entities.entrySet()) { 
        entry.getValue().render(g);
    }
}

我试图通过添加到 newEntities HashMap 而不是添加到实体 HashMap 来避免并发修改异常。在我的 tick 方法中,我循环遍历 newEntities HashMap 并将其中存在的每个项目添加到实体中,依次删除每个项目。只有在那之后,我才会遍历实体 HashMap。

我怎么可能在迭代时修改地图?

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    不允许在使用增强的 for 循环对其进行迭代时直接从 Map 中删除条目。相反,使用显式迭代器进行迭代,以及迭代器的remove() 方法。

    Iterator<Map.Entry<Integer, Entity>> iter = newEntities.entrySet().iterator();
    while (iter.hasNext()) { 
        Map.Entry<Integer, Entity> entry = iter.next();
        entities.put(entities.size(), entry.getValue());
        iter.remove();
    }
    

    对第二个循环执行相同的操作。

    【讨论】:

    • 谢谢伊兰。像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2013-08-15
    • 2013-03-12
    相关资源
    最近更新 更多