Java ArrayIndexOutOfBounds错误

所以我有一个数组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; } } 

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

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

  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) == x不会均匀分布四个方向的概率。 无法保证这四种情况中的任何一种都能成功。 将r.nextInt(3)的结果保存在变量中,然后对该变量进行比较。

你检查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不是否定的。