try-catch语句中的递归调用

时间:2015-08-31 20:09:31

标签: java recursion

我有以下代码片段:

public static void main(String[] args) {
    foo();
}
public static void foo() {
    try {
        foo();
    } catch (Throwable t) {
        foo();
    }
}

有谁能解释一下这里发生了什么?请详细说明。

我已更改此内容并添加println方法以显示内容:

...
try {
    System.out.println("+");
    foo();
} catch (Throwable t) {
    System.out.println("-");
    foo();
}
...

我得到这样的东西(过程没有停止):

+
+
+
+
+--
+--
+
+--
+--
+
+
+--
+--
+
+--
+--
+
+
+
+--
+--

2 个答案:

答案 0 :(得分:2)

foo可以退出的唯一方法是stackoverflow。我们可以通过

来模拟效果
public static void foo(int i)
{
    if(i>=N) return; // stack too deep

    foo(i+1);
    foo(i+1);
}

对于最大堆栈深度,指数成本很高。

在我的机器上,所需时间约为6ns * 2^N

最大堆栈深度超过10,000,因此需要大约

        10000000000000000000000000000000
        .... 
        (thousands of zeros)  
        ... 
        00000000000000000000000000000000 

多年来完成该计划,给予或采取一个恒定的因素:)

答案 1 :(得分:2)

您无限期地调用相同的方法。这意味着将抛出StackOverflowError。

但是因为你正在捕捉它(StackOverflowError不是例外,它是java.lang.Error,这是一个java.lang.Throwable)应用程序不会停止,它会继续递归,它会根本不停止。

当我尝试将堆栈大小减小到最小(-Xss160k -Xoss1k)时,它没有任何帮助。

我知道我没有解释为什么会发生这种情况,我需要对代码进行分析以获取更多信息,但这是一个有趣的问题,也许在JVM内部具有深厚专业知识的人确切知道发生了什么。