2011-04-30 53 views
2

我正在用AndEngine製作Android遊戲。我有一個精靈陣列列表,每次更新時我都要檢查玩家精靈是否與其中任何一個發生了碰撞。但此摘錄我的代碼是讓我頭疼:android ArrayList IndexOutOfBoundsException

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()值。我把每一次迭代拼寫出的ArrayList的大小和我的當前值的日誌信息,而且它似乎是正確的:

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) 
+0

你可以發佈完整的循環代碼,和更多的錯誤日誌? – MByD 2011-04-30 05:04:03

+0

編輯,我把整個onUpdate方法 – herpderp 2011-04-30 05:22:35

回答

1

方法1:

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

方法2:

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

方法1是更優選的。

+0

不,同樣的事情發生。 – herpderp 2011-04-30 05:36:31

+0

您嘗試過哪種方法,請嘗試在循環內註釋整個代碼並僅打印對象精靈 – 2011-04-30 05:43:12

相關問題