Java ArrayIndexOutOfBounds错误

时间:2015-09-09 17:22:19

标签: java arrays

所以我有一个数组Canvas [256] [256],它有一个随机索引Canvas [r] [r](r是随机的)设置为1.然后我想循环遍历数组,看看究竟是哪个索引是不是0,然后选择一个随机点(上,下,左,右)并将其设置为1。它通过第一个循环完美地工作,但之后给我一个数组越界错误。

public static void checkPopulation() {
    for(int x = 0; x < Canvas.length; x++) {
        for(int y = 0; y < Canvas.length; y++) {
            if(Canvas[x][y] != 0) {
                particleDiffusion(x, y);
            }
        }
    }

}

public static void particleDiffusion(int x, int y) {
    Random r = new Random();
    if(r.nextInt(3) == 0) {
        Canvas[x+1][y] = 255;
    } else if(r.nextInt(3) == 1) {
        Canvas[x][y+1] = 255;
    } else if(r.nextInt(3) == 2) {
        Canvas[x-1][y] = 255;//THIS IS WHERE ERROR IS POINTING
    } else if(r.nextInt(3) == 3) {
        Canvas[x][y-1] = 255;
    }
    if(stepsTaken < diffusionStep) {
        checkPopulation();
    } else {
        System.out.println("done");
        return;
    }
}

有人可以帮我解决我做错的事吗?为什么它循环一次然后给出错误?

2 个答案:

答案 0 :(得分:5)

你检查x和y是否小于Canvas.length,然后使用x + 1和y + 1作为数组索引,这就是原因。固定代码如下。

public static void checkPopulation() {
    for(int x = 0; x < Canvas.length; x++) {
        for(int y = 0; y < Canvas.length; y++) {
            if(Canvas[x][y] != 0) {
                particleDiffusion(x, y);
            }
        }
    }
}

public static void particleDiffusion(int x, int y) {
    Random r = new Random();
    if(r.nextInt(3) == 0) {
        if( x+1 < Canvas.length)
            Canvas[x+1][y] = 255;
    } else if(r.nextInt(3) == 1) {
        if( y+1 < Canvas.length)
            Canvas[x][y+1] = 255;
    } else if(r.nextInt(3) == 2) {
        if( x > 0)
            Canvas[x-1][y] = 255;//THIS IS WHERE ERROR IS POINTING
    } else if(r.nextInt(3) == 3) {
        if( y > 0)
            Canvas[x][y-1] = 255;
    }
    if(stepsTaken < diffusionStep) {
        checkPopulation();
    } else {
        System.out.println("done");
        return;
    }
}

编辑:你也应该检查x-1和y-1不是负面的。

答案 1 :(得分:2)

好的,让我们一个接一个地解决你所有的问题。

  1. 指数。这很明显,我不会进一步讨论。

  2. checkPopulation()particleDiffusion()以递归方式互相调用。由于在代码路径中未修改stepsTakendiffusionStep,因此最终会看到StackOverflow。您似乎不需要为此使用递归,为什么不使用循环呢?我假设您有checkPopulation()的初始通话,那么如何更换它:

    for (int stepsTaken = 0; stepsTaken < diffusionStep; stepsTaken++) {
        checkPopulation();
    }
    

    现在,在高级别,您的方法看起来像

    main() {
        checkPopulation();
    }
    
    checkPopulation() {
        ...
        particleDiffusion();
    }
    
    particleDiffusion() {
        ...
        if (stepsTaken < diffusionStep) {
            checkPopulation();
        }
    }
    

    随着更改,它现在看起来像

    main() {
        for (int stepsTaken = 0; stepsTaken < diffusionStep; stepsTaken++) {
            checkPopulation();
        }
    }
    
    checkPopulation() {
        ...
        particleDiffusion();
    }
    
    particleDiffusion() {
        ...
    }
    
  3. 多次调用r.nextInt(3) == x不会均匀分布四个方向的概率。我们无法保证这四种情况中的任何一种都能成功。将r.nextInt(3)的结果保存在变量中,然后对该变量进行比较。