使用列表的java索引超出范围的异常

时间:2014-05-28 11:42:52

标签: java indexoutofboundsexception

我在列表中为子弹制作了一些代码,为小怪制作了一个列表。 我试图做一些可以检测到碰撞然后删除子弹和暴徒的东西。但是,我得到了一个

  

java.lang.IndexOutOfBoundsException

在这一行:

  

如果(gmgr.bulletlist.get(ⅰ).X + X&GT = gmgr.moblist.get(mobnum).X&安培;&安培; gmgr.bulletlist.get(ⅰ).X + X&LT = gmgr.moblist。得到(mobnum).X + 32){

这是我的完整代码:

for (int x = 0; x < gmgr.bulletlist.get(i).size; x++) {//size is the size of the bullet in pixels in this case 8
   for (int y = 0; y < gmgr.bulletlist.get(i).size; y++) {
       for (int mobnum = 0; mobnum < gmgr.moblist.size();//here size is the length of the list mobnum++) {
           if(gmgr.bulletlist.get(i).x+x>=gmgr.moblist.get(mobnum).x&&gmgr.bulletlist.get(i).x+x<=gmgr.moblist.get(mobnum).x+32){//here I take the position of the bullet and add and check for collision on every pixel
               if(gmgr.bulletlist.get(i).y+y>=gmgr.moblist.get(mobnum).y&&gmgr.bulletlist.get(i).y+y<=gmgr.moblist.get(mobnum).y+32){
                   gmgr.moblist.remove(mobnum);
                   mobnum-=1;//the problem is for as far as I know that I delete this while in this loop

                   gmgr.bulletlist.remove(i);
                   i-=1;
                   System.out.println("gotcha!!!!");//which means that the bullet hit the mob
               }
           }
       } 
   }
}

我需要找到一种方法来删除这些子弹。我们也欢迎任何改进我的代码的想法

2 个答案:

答案 0 :(得分:1)

索引imobnum超出范围。最可能的原因是这些线:

                       gmgr.bulletlist.remove(i);
                       i-=1;

考虑i==0。您移除位置0上的项目,然后设置i-=1,现在i==-1。现在,在三个循环中的任何一个循环的下一次迭代中,您正在尝试访问gmgr.bulletlist.get(i),这将给出您发布的异常。

答案 1 :(得分:1)

代码有点乱,但是:

gmgr.bulletlist.remove(i);
i-=1;

这里有一点是你继续迭代其他怪物。所以如果它是子弹0,那么下一个暴徒会在索引-1找到子弹

为了更好地找到问题,你应该事先得到对象,这样可以避免删除索引问题,并且还可以清楚地看到正在发生的事情,因为当前异常可能引用if中的任何列表。

另外,使用一个标志来表示命中,并跳到下一个项目

即。

boolean hit = false;
Bullet bullet = gmgr.bulletlist.get(i);
for (int x = 0; x < bullet.size; x++) {
    for (int y = 0; y < bullet .size; y++) {
        for (int mobnum = 0; mobnum < gmgr.moblist.size(); mobnum++) {
            Mob mob = gmgr.moblist.get(mobnum); 
            if(bullet.x+x>=mob.x && bullet.x+x<=mob.x+32){
                if(bullet.y+y>=mob.y&&bullet.y+y<=mob.y+32){
                    gmgr.moblist.remove(mobnum);
                    gmgr.bulletlist.remove(i);
                    hit = true;
                    break; //skip other mobs, bullet is invalid
                }
            }
         }
     if(hit) break; //skip other bullet pixel, bullet is invalid
     }
 if (hit) { //move to the next bullet, reset hit flag
    hit = false;
    break;
 } 
 }