2012-04-09 84 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(所以每一步我更接近解决方案(在这个事实我的递归锚))