2013-05-25 306 views
0

我有標籤網格(大小爲n * n),我想填充其不規則部分的顏色。我寫了一個方法用顏色填充標籤

private void fill(int j){ 

    while(board[j].getName().equals("s")){ 
     board[j].setBackground(Color.yellow); 

     try{ 
      fill(j-1); 
     } catch (ArrayIndexOutOfBoundsException e){} 

     try{ 
      fill(j+1);  
     } catch (ArrayIndexOutOfBoundsException e){} 

     try{ 
      fill(j+n); 
      } catch (ArrayIndexOutOfBoundsException e){} 

     try{ 
      fill(j-n); 
      } catch (ArrayIndexOutOfBoundsException e){} 

    } 
} 

我仍然得到StackOverflowError。我沒有使用大的部件(我的n是最大20),我試圖用if替換,但沒有工作。它對於堆棧來說太大了,或者可能存在無限循環?我如何解決這個問題?

+0

遞歸調用的終止條件是什麼?你期望什麼最小值和最大值** j **保持 –

+0

爲了更好地幫助您,請發佈[SSCCE](http://sscce.org/)。 –

回答

1

比方說,由於某種原因

  • jj-1條件while會很滿意,
  • j-2

休息值,因此,如果你調用fill(j)程序將

  1. 測試while條件j(通)
  2. 輸入while
  3. setBackgroundj
  4. 調用fill(j-1);

    現在程序將調用fill(j+1)之前,計劃將要完成fill(j-1)所以控制流將轉移到fill(j-1)水平,計劃將

    1. 測試while條件j-1(通過)
    2. 你進入while loop
    3. setBackground for j-1
    4. invoke fill((j-1)-1);換句話說fill(j-2)

      而再次之前控制的fill((j-1)+1)流將被移動到fill(j-2)因此計劃將

      1. 測試while條件j-2(失敗)
      2. 計劃着進入循環,這樣會返回從填充(J-2返回)
    5. 調用fill((j-1)+1)其是相同fill(j)

因此,您的應用程序將嘗試重複相同的場景,但這次將導致StackOverwlow導致不同的堆棧級別。


爲了防止這種情況可能發生變化的條件也測試,如果你已經在這個位置上,像

while(board[j].getName().equals("s") && board[j].getBackground() != Color.yellow) 

可以/也應該改變whileif

+0

謝謝,它的工作原理。但是你知道我怎麼能把它切到邊界?我在哪裏打破/返回以避免在前一行中的標籤着色時在下一行着色標籤? – user2420287

+0

我不確定你在問什麼。你應該創建另一個問題,並描述你的情況,表明你擁有和想要擁有的東西。 – Pshemo

+0

我有n×n的正方形。在某些情況下,標籤j + 1可能是下一行標籤中的第一個,它會被着色,但我不想要它 – user2420287

0

board[j].setName("bgSet")

board[j].setBackground(Color.yellow)

這可能會解決這個問題,否則你而總是正確的。