2016-07-14 77 views
2

我想避免并发修改异常。我循环一个实体HashMap来勾选()每个实体。玩家实体在屏幕上移动WASD输入,并且当玩家向右移动时测试addNewEntity()方法,我打电话GameState.addNewEntity(new Explosion(true, this.x, this.y));。玩家出现几次爆炸,然后出现错误。 Player类扩展了扩展Entity的Creature。 Explosion扩展了Entity类。试图避免并发修改异常

此代码是从我的游戏状态类:

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); 

我打勾()方法:

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。

我是在迭代它的同时修改地图的可能性如何?

回答

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(); 
} 

对第二个循环做同样的操作。

+0

谢谢伊兰。像魅力一样工作。 – Fabced