2015-09-09 111 views
0

所以我有一個數組Canvas [256] [256],它有一個隨機索引Canvas [r] [r](r是隨機的),設置爲1.然後我想循環遍歷數組看看究竟哪個索引不是0,然後選擇一個隨機點(上面,下面,左邊,右邊),並將其設置爲1。它通過第一個循環完美地工作,但之後給了我一個數組超出界限的錯誤。Java ArrayIndexOutOfBounds錯誤

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; 
    } 
} 

有人能幫我解決我在做什麼錯嗎?爲什麼它循環一次,然後給出錯誤?

+0

你用調試器介紹過嗎?當您指定的線路上出現「x = 0」時會發生什麼情況? – Zong

+0

你確定你得到了「方形2維陣列」嗎? – seahawk

回答

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)的結果保存在一個變量中,然後對該變量進行比較。

+0

每次調用particleDiffusion,stepsTaken ++。 – Tyson

+0

@Tyson當然。如果'diffusionStep'很大,你仍然會有一個StackOverflow。使用循環完全解決了這個問題,並且更清晰。 – Zong

+0

我把所有這些放在一個通過diffusionStep循環的循環裏面?那麼完全消除particleDiffusion並同時循環兩者? – Tyson

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不是負值。

+0

我已經試過了,它給了我一個stackoverflow錯誤。 – Tyson

+0

@Tyson:那麼這是一個不同的問題......並且可能與一個事實有關,即你沒有在代碼中的任何地方更改'stepsTaken'或'diffusionStep' ......你如何期望*它停止遞歸? –

+0

我會改變它,每次checkPopulation被調用stepsTaken ++我只是沒有粘貼那部分。 – Tyson