机器人的ArrayList抛出IndexOutOfBoundsException [英] android ArrayList IndexOutOfBoundsException

查看:108
本文介绍了机器人的ArrayList抛出IndexOutOfBoundsException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在与AndEngine的机器人比赛。我有精灵的ArrayList,并在每次更新我要检查,如果玩家精灵已经相撞,其中任何一个。但是,此摘录我的code是让我头疼:

 公共无效的OnUpdate(最终浮动pSecondsElapsed){
    sprites.addAndRemove();
    的for(int i = 0; I< sprites.size();我++){
        如果(playerSprite.collidesWith(sprites.get(ⅰ))){
            sprites.setToRemove(ⅰ);
            //添加精灵移除队列数组列表。
            //实际的精灵ArrayList中没有被触及,直到addAndRemove()火灾。
        }
    }
}
 

看起来pretty的基础,但不知何故 sprites.get(我)抛出这样的:

  E / AndroidRuntime(883):致命异常:UpdateThread
E / AndroidRuntime(883):java.lang.IndexOutOfBoundsException:无效的指数4,大小为4
 

尽管 I< sprites.size(),我以某种方式达到的值sprites.size() 。我把日志在每次迭代中的消息拼出ArrayList的大小和i的当前值,这似乎是正确的:

  D /应用程序(883):大小为4
D /应用程序(883):我是0
D /应用程序(883):大小为4
D /应用程序(883):我是1
D /应用程序(883):大小为4
D /应用程序(883):我是2
D /应用程序(883):大小为4
D /应用程序(883):我是3
 

...紧接着的异常。

所以,我在这里难倒了,怎么能这样呢?

  W / dalvikvm(883):主题ID = 9:线程退出与未捕获的异常(组= 0x40015560)
E / AndroidRuntime(883):致命异常:UpdateThread
E / AndroidRuntime(883):java.lang.IndexOutOfBoundsException:无效的指数4,大小为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)
 

解决方案

方法1:

 的(雪碧精灵:精灵){
   如果(playerSprite.collidesWith(精灵)){
      //  - 
   }
}
 

方法2:

 的(迭代器<雪碧> I = sprites.iterator(); i.hasNext()){
      如果(playerSprite.collidesWith(i.next())){
         //  - 
      }
}
 

方法1是更preferable。

I'm making an android game with AndEngine. I have an arraylist of sprites, and on each update I want to check if the player sprite has collided with any of them. But this excerpt of my code is giving me a headache:

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.
        }
    }
}

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

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

Despite i<sprites.size(), i is somehow reaching the value of sprites.size(). I put log messages in each iteration spelling out the size of the arraylist and the current value of i, and it seems to be correct:

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

...followed immediately by the exception.

So I'm stumped here, how can this happen?

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)

解决方案

Method 1:

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

Method 2:

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

Method 1 is more preferable.

这篇关于机器人的ArrayList抛出IndexOutOfBoundsException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆