2015-09-19 41 views
-1

我有一個渲染方法和一個用於滴答世界的方法。因爲它們有時同時運行,所以在循環Tiles時出現ConcurrentModificationException異常。Java - 在渲染和打勾方法中設置修改瓷磚

public void render(Graphics gfx) 
{ 
    bounds.setLocation(getEdgeX(), getEdgeY()); 

    for(Tile tile : tiles) 
    { 
     if(bounds.intersects(tile.getBounds())) 
     { 
      activeTiles.add(tile); 
      tile.render(gfx); 
     } 
    } 

    translate(gfx); 
    int x = platformer.getX() - platformer.getX() % background.getWidth(); 
    gfx.drawImage(background, x, 0, null); 
    gfx.drawImage(background, x + Platformer.SCREEN_SIZE.width, 0, null); 
    platformer.render(gfx); 
} 

public void tick() 
{ 
    platformer.tick(); 

    for(Tile tile : activeTiles) //Exception 
    { 
     if(tile instanceof AdvancedTile) 
     { 
      ((AdvancedTile)tile).tick(); 
     } 
    } 
} 

異常

Exception in thread "main" java.util.ConcurrentModificationException 
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:926) 
at java.util.HashMap$KeyIterator.next(HashMap.java:960) 
at me.lordal.platformer.world.World.tick(World.java:59) 
at me.lordal.platformer.world.WorldManager.tickCurrentWorld(WorldManager.java:55) 
at me.lordal.platformer.screens.GameScreen.tick(GameScreen.java:41) 
at me.lordal.platformer.screens.CardHandler.tick(CardHandler.java:60) 
at me.lordal.platformer.Platformer.update(Platformer.java:65) 
at me.lordal.platformer.Platformer.run(Platformer.java:53) 
at me.lordal.platformer.Platformer.main(Platformer.java:25) 

正如你所看到的渲染方法有它增加了瓷磚設定的某一部分,而滴答滴答的方法有瓷磚循環以及。

我該如何解決這個問題?

+0

現在你已經改變了你的文章中的所有內容,並且使我正在刪除的答案無效。請發佈[mcve]。 –

回答

0

由於我沒有看到任何「迭代改變」代碼,我懷疑這裏的問題是關於併發性。

兩種方法不能重疊執行,除非它們被不同的線程調用。

如果您遇到這種情況,你可以讓他們syncronized對對象的鎖:

public synchronized void render(Graphics gfx) { 
    // ... 
} 
public synchronized void tick() { 
    // ... 
} 

雖然後續調用將需要等待以前調用執行完成,這可能會降低性能。