【问题标题】:illegalStateException when using ArrayList and iterator使用 ArrayList 和迭代器时出现非法状态异常
【发布时间】:2011-07-16 18:55:55
【问题描述】:

我在小行星射击游戏中创建和删除对象,但仅在某些情况下它会崩溃并出现此错误:

07-16 19:35:05.071:错误/AndroidRuntime(3553):致命异常: 线程 11

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

07-16 19:35:05.071: 错误/AndroidRuntime(3553): 在 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;
                }
            }   
        }   
    }

}

您知道在哪里寻找可能导致此错误的原因吗?

【问题讨论】:

  • 您在两个不同的迭代器上调用remove()shotItr,然后是asterItr。抛出IllegalStateException 的行是哪一行?

标签: java android


【解决方案1】:

一颗小行星被击中后,您需要跳出内循环,即迭代镜头。您的代码发现两个不同的镜头击中了同一个小行星并试图移除同一个小行星两次。顺便说一句,这也可能表明您的碰撞检测存在问题。

【讨论】:

  • 很好,谢谢!一双新鲜的眼睛总是有帮助的!小行星被移除后,我应该跳出射击循环。今晚我脑子里肯定有太多小行星……;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 2014-02-12
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
相关资源
最近更新 更多