2011-07-16 79 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

真棒回答。 –