2012-04-09 83 views
14

我正在寫一個函數,將自己調用約5000次。當然,我得到一個StackOverflowException。有沒有辦法,我可以在一個相當簡單的方式?:Java:如何避免StackOverflowException

void checkBlocks(Block b, int amm) { 

    //Stuff that might issue a return call 

    Block blockDown = (Block) b.getRelative(BlockFace.DOWN); 
    if (condition) 
     checkBlocks(blockDown, amm); 


    Block blockUp = (Block) b.getRelative(BlockFace.UP); 
    if (condition) 
     checkBlocks(blockUp, amm); 

    //Same code 4 more times for each side 

} 

順便說一句改寫這個代碼的方式,什麼是我們可以有多深調用的函數的限制?

謝謝!

+0

http://stackoverflow.com/questions/214741/what-is -a-stack-overflow-error – 2012-04-09 13:01:27

回答

17

也許使用堆棧?

void checkBlocks(Block b, int amm) { 
    Stack<Block> blocks = new Stack<Block>(); 
    blocks.push(b); 
    while (!blocks.isEmpty()) { 
    b = blocks.pop(); 
    Block blockDown = (Block) b.getRelative(BlockFace.DOWN); 
    if (condition) 
     blocks.push(block); 
    Block blockUp = (Block) b.getRelative(BlockFace.UP); 
    if (condition) 
     blocks.push(block); 
    } 
} 
+0

非常感謝,效果很好。那個班級可能會在以後多次得到方便。泰! – 2012-04-09 17:25:26

0

您可以使用-Xss4m來增加堆棧大小。

+0

但是如果電路板尺寸不斷增加呢?我認爲他意識到這一點,並沒有問如何增加堆棧大小,而是如何重構代碼! – barsju 2012-04-09 12:59:54

0

只要塊可用,您可以將「塊」放入隊列/堆棧並進行迭代。

0

很明顯,你得到StackOverflow與你的遞歸分支因素。在其他語言中可以實現by Tail Call Optimization。但我想你的問題需要另一種解決方法。

理想情況下,您在塊上執行一些檢查。也許你可以獲得所有塊的列表並迭代檢查每個塊?

4

java中的默認堆棧大小爲512kb。如果超出該程序將終止拋出StackOverflowException

你可以通過JVM參數增加堆棧大小: -Xss1024k

現在堆棧大小爲1024KB。您可以根據您的環境

我不認爲我們可以通過編程改變這種

0

在大多數情況下,遞歸以錯誤的方式使用提供更高的價值。您不應該獲得堆棧溢出異常。 您的方法沒有返回類型/值。 你如何確保你的初始塊b有效?

如果使用遞歸,自己回答以下問題:

  • 什麼是我的遞歸錨(我什麼時候用遞歸停止)
  • 什麼是我的遞歸步驟(我怎麼降低我的電話號碼的計算)

例子:

  • N! => n * n-1!

我的遞歸錨點是n == 2(結果是2),所以我可以計算從這個錨點開始的所有結果。

我的遞歸步驟爲n-1(所以每一步我更接近解決方案(在這個事實我的遞歸錨))