2011-07-16 100 views
2

我創造和小行星射擊遊戲,只在某些情況下它崩潰刪除對象,我得到這個錯誤時:IllegalStateException異常使用ArrayList和迭代器

07-16 19:35:05.071: ERROR/AndroidRuntime(3553): FATAL EXCEPTION: Thread-11

07-16 19:35:05.071: ERROR/AndroidRuntime(3553): java.lang.IllegalStateException

07-16 19:35:05.071: ERROR/AndroidRuntime(3553): at java.util.AbstractList$SimpleListIterator.remove(AbstractList.java:69)

這是測試對於鏡頭之間碰撞的代碼和小行星:

public void shotAstrCollision(){ 

    asterItr = asteroids.listIterator(); 

    while(asterItr.hasNext()){ 
     aster = asterItr.next(); 
     shotItr = shots.listIterator(); 

     while(shotItr.hasNext()){ 
      shot = shotItr.next(); 
      float shotToAst = (float) Math.sqrt((aster.x + astW/2 - shot.x)*(aster.x + astW/2 - shot.x) + (aster.y + astH/2 - shot.y)*(aster.y + astH/2 - shot.y)); 
      if (shotToAst < astW/2){ 
       //asteroid is shot 
       aster.power -= shot.power; 
       shotItr.remove(); 
       shotCount--; 
       createExplosion(aster.x + astW/2, aster.y + astH/2); 
       SoundManager.playSound(1, 1); 
       if (aster.power <= 0) { 
        asterItr.remove(); 
        astCount--; 
       }else{ 
        aster.shotColor = ASTEROID_SHOT_PAINT_FRAMES; 
       } 
      } 
     } 
    } 

} 

你知道在哪裏尋找這個錯誤的可能原因嗎?

+0

您正在調用'remove()'到兩個不同的迭代器上:'shotItr'和後來的'asterItr'。哪一行會拋出'IllegalStateException'? –

回答

9

在發現小行星後,您需要跳出內部循環,在這裏循環拍攝照片。你的代碼發現兩個不同的鏡頭撞擊了同一個小行星,並試圖將相同的小行星移除兩次。這也可能指出你的碰撞檢測問題,順便說一句。

+0

好吧,謝謝!一雙新鮮的眼睛總是有幫助!在小行星被移除後,我應該跳出射擊循環。今晚我的腦袋裏一定有太多的小行星......;) – Lumis

+0

真棒回答。 –