java - 安卓 ArrayList IndexOutOfBoundsException

标签 java android andengine

我正在使用 AndEngine 制作安卓游戏。我有一个 Sprite 数组列表,在每次更新时我都想检查玩家 Sprite 是否与它们中的任何一个发生了碰撞。但是我的这段代码摘录让我很头疼:

public void onUpdate(final float pSecondsElapsed) {
    sprites.addAndRemove();
    for (int i=0;i<sprites.size();i++) {
        if(playerSprite.collidesWith(sprites.get(i))) {
            sprites.setToRemove(i); 
            //adds the sprite to a removal queue arraylist. 
            //the actual sprites arraylist is not touched until addAndRemove() fires.
        }
    }
}

看起来很基本,但不知何故 sprites.get(i)抛出这个:

E/AndroidRuntime(  883): FATAL EXCEPTION: UpdateThread
E/AndroidRuntime(  883): java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4

尽管i<sprites.size() , 我以某种方式达到了 sprites.size() 的值(value).我在每次迭代中放入日志消息,拼写出 arraylist 的大小和 i 的当前值,它似乎是正确的:

D/app(  883): size is 4
D/app(  883): i is 0
D/app(  883): size is 4
D/app(  883): i is 1
D/app(  883): size is 4
D/app(  883): i is 2
D/app(  883): size is 4
D/app(  883): i is 3

...紧随其后的是异常。

所以我被难住了,这怎么会发生?

W/dalvikvm(  883): threadid=9: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime(  883): FATAL EXCEPTION: UpdateThread
E/AndroidRuntime(  883): java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4
E/AndroidRuntime(  883):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
E/AndroidRuntime(  883):    at java.util.ArrayList.get(ArrayList.java:311)
E/AndroidRuntime(  883):    at org.anddev.andengine.entity.Entity.onManagedUpdate(Entity.java:776)
E/AndroidRuntime(  883):    at org.anddev.andengine.entity.Entity.onUpdate(Entity.java:648)
E/AndroidRuntime(  883):    at org.anddev.andengine.entity.Entity.onManagedUpdate(Entity.java:776)
E/AndroidRuntime(  883):    at org.anddev.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:261)
E/AndroidRuntime(  883):    at org.anddev.andengine.entity.Entity.onUpdate(Entity.java:648)
E/AndroidRuntime(  883):    at org.anddev.andengine.engine.Engine.onUpdateScene(Engine.java:494)
E/AndroidRuntime(  883):    at org.anddev.andengine.engine.Engine.onUpdate(Engine.java:489)
E/AndroidRuntime(  883):    at org.anddev.andengine.engine.Engine.onTickUpdate(Engine.java:465)
E/AndroidRuntime(  883):    at org.anddev.andengine.engine.Engine$UpdateThread.run(Engine.java:684)

最佳答案

方法一:

for(Sprite sprite : sprites){
   if (playerSprite.collidesWith(sprite)) {
      //--
   }
}

方法二:

for (Iterator<Sprite> i = sprites.iterator(); i.hasNext();) {
      if (playerSprite.collidesWith(i.next())) {
         //--
      }
}

方法一更可取。

关于java - 安卓 ArrayList IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5839652/

相关文章:

java - 按 Enter 键后命令提示符卡住,循环无效

安卓 GSON : Parsing several different objects from the same response

android - 使用 GPS android 获取邮政编码

android - 无法在模拟器(Andengine)上运行游戏

java - 如何将arrayList的元素传递给可变参数函数

java - TimerHandler 每秒使用受限随机生成器

java - 为什么gradle build将 “-1”添加到我的包ID的末尾?

java - fx :jar in NetBeans? 在哪里 - JavaFX

java - 解析 JSONArray 时出现 NullPointerException

Android 运行时布局教程