修复索引超出界限异常

时间:2015-09-12 05:29:33

标签: java arrays exception indexing

我遇到数组索引问题。代码应该在20x20网格周围移动Ant类型的对象。

public class Test {
    Organism[][] grid = new Organism[20][20];

    public static void main(String[] args) {

        for (int i = 0; i < 20; i++){
            for (int j = 0; j < 20; j++){
                if(grid[i][j] instanceof Ant){
                        int xpos = i;
                        int ypos = j;
                        grid[i][j].move(xpos, ypos);
                        grid[i][j].breed(xpos, ypos);
                }
            }
        }
}

Class Ant扩展了Organism,class Organism扩展了Test。

public class Ant extends Organism{
    public void move(int xpos, int ypos){
    Random rand = new Random();
        int direction = rand.nextInt(3);
        if(direction == 0){
            if(grid[xpos][ypos + 1] == null && xpos <20 && ypos <20)
            {
                grid[xpos][ypos] = grid[xpos][ypos];
                grid[xpos][ypos] = null;
            {
        }
    }
}

方法移动应该在网格上选择随机方向,如果相邻空间为空,则移动Ant。它也不能超出20x20网格。 (对于其他方向,还有三个if循环)。

如果我将move方法中的第六行更改为:

if(grid[xpos][ypos] == null && xpos <20 && ypos <20)

然后不会抛出任何错误。

我对发布这篇文章犹豫不决,因为这可能是我的一个小错误,但我已经盯着这几个小时了。

非常感谢协助。

1 个答案:

答案 0 :(得分:0)

从左到右评估&&的操作数,如果其中一个评估为false,评估将停止。因此,如果一个或多个操作数具有潜在危险(例如可能超出范围的数组查找),并且某些其他操作数应该防止这种情况,那么保护操作数需要先行。此外,您需要检查您实际使用的索引,即xposypos + 1,并且忘记在移动蚂蚁的分配中使用ypos + 1

if (xpos < 20 && ypos + 1 < 20 && grid[xpos][ypos + 1] == null) {
    grid[xpos][ypos + 1] = grid[xpos][ypos];
    grid[xpos][ypos] = null;
}

(并且,假设xposypos是有效索引,您无需检查xpos。)