java - android ArrayList IndexOutOfBoundsException -


i'm making android game andengine. have arraylist of sprites, , on each update want check if player sprite has collided of them. excerpt of code giving me headache:

public void onupdate(final float psecondselapsed) {     sprites.addandremove();     (int i=0;i<sprites.size();i++) {         if(playersprite.collideswith(sprites.get(i))) {             sprites.settoremove(i);              //adds sprite removal queue arraylist.              //the actual sprites arraylist not touched until addandremove() fires.         }     } } 

looks pretty basic, somehow sprites.get(i) throws this:

e/androidruntime(  883): fatal exception: updatethread e/androidruntime(  883): java.lang.indexoutofboundsexception: invalid index 4, size 4 

despite i<sprites.size(), somehow reaching value of sprites.size(). put log messages in each iteration spelling out size of arraylist , current value of i, , seems correct:

d/app(  883): size 4 d/app(  883): 0 d/app(  883): size 4 d/app(  883): 1 d/app(  883): size 4 d/app(  883): 2 d/app(  883): size 4 d/app(  883): 3 

...followed exception.

so i'm stumped here, how can happen?

w/dalvikvm(  883): threadid=9: thread exiting uncaught exception (group=0x40015560) e/androidruntime(  883): fatal exception: updatethread e/androidruntime(  883): java.lang.indexoutofboundsexception: invalid index 4, size 4 e/androidruntime(  883):    @ java.util.arraylist.throwindexoutofboundsexception(arraylist.java:257) e/androidruntime(  883):    @ java.util.arraylist.get(arraylist.java:311) e/androidruntime(  883):    @ org.anddev.andengine.entity.entity.onmanagedupdate(entity.java:776) e/androidruntime(  883):    @ org.anddev.andengine.entity.entity.onupdate(entity.java:648) e/androidruntime(  883):    @ org.anddev.andengine.entity.entity.onmanagedupdate(entity.java:776) e/androidruntime(  883):    @ org.anddev.andengine.entity.scene.scene.onmanagedupdate(scene.java:261) e/androidruntime(  883):    @ org.anddev.andengine.entity.entity.onupdate(entity.java:648) e/androidruntime(  883):    @ org.anddev.andengine.engine.engine.onupdatescene(engine.java:494) e/androidruntime(  883):    @ org.anddev.andengine.engine.engine.onupdate(engine.java:489) e/androidruntime(  883):    @ org.anddev.andengine.engine.engine.ontickupdate(engine.java:465) e/androidruntime(  883):    @ org.anddev.andengine.engine.engine$updatethread.run(engine.java:684) 

method 1:

for(sprite sprite : sprites){    if (playersprite.collideswith(sprite)) {       //--    } } 

method 2:

for (iterator<sprite> = sprites.iterator(); i.hasnext();) {       if (playersprite.collideswith(i.next())) {          //--       } } 

method 1 more preferable.


Comments