处理中的ArrayIndexOutOfBoundsException

时间:2014-06-16 07:13:28

标签: java arrays processing indexoutofboundsexception

所以我一直在研究一个小坦克程序,但每当我尝试运行它时,我在第477行(http://pastebin.com/k4WNXE6Q)得到一个ArrayIndexOutOf BoundsException。

void placeStations(int Number) {
  for (int i = 0; i<Number; i++) {
    stations.add(new RefillStation(int(random(0, width)), int(random(0, height))));

    // This line of code refuses to work. I get an 'ArrayIndexOutOfBoundsException: -3'
    RefillStation station = stations.get(i);

    for (Tank tank : tanks) {
      if (station.getRectangle().intersects(tank.getRectangle())) {
        station.kill();
        i=i-1;
      }
    }
    for (Obstacle obstacle : obstacles) {
      if (station.getRectangle().intersects(obstacle.getRectangle())) {
        station.kill();
        i=i-1;
      }
    }
  }
}

我已经尝试了几个小时才能找到错误,但我看不出与上面的方法有什么不同,这似乎工作正常。我在某些地方使用'i'类型循环,因为每当我尝试从现代for循环中的索引中删除某些东西时,它会给我一个大小更改异常。我有什么想法可以解决这个问题?

3 个答案:

答案 0 :(得分:0)

与坦克和障碍物的多次重叠将导致i重复减少。但是你想只杀掉一次电台:突破循环。

 for (Tank tank : tanks) {
   if (station.getRectangle().intersects(tank.getRectangle())) {
     station.kill();
     i=i-1;
     break;
   }
 }

答案 1 :(得分:0)

对于(每个)样式循环的

使用底层的迭代器,并且大多数时候你不能编辑一个你通过迭代器对象的remove()方法而不是迭代的集合。要做到这一点,你必须明确地使用迭代器。见this answer

btw带有大写第一个字符的变量名称,但是让人们更难阅读和理解你的代码。

答案 2 :(得分:0)

我不确定这是否是问题,但不是ArrayList应该有索引的第一个参数和元素的第二个参数:

public void add(int index,        E元素)  你的代码是:

stations.add(new RefillStation(int(random(0, width)), int(random(0, height))));

首先添加元素然后指定索引。