Java try-catch语句中的递归调用

Java try-catch语句中的递归调用,java,recursion,Java,Recursion,我有以下代码片段: public static void main(String[] args) { foo(); } public static void foo() { try { foo(); } catch (Throwable t) { foo(); } } 谁能解释一下这里发生了什么事?请详细说明 我修改了这篇文章,并添加了println方法来展示一些东西: ... try { System.out.prin

我有以下代码片段:

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();
}
...
我得到了这样的结果(过程没有停止):


foo
可以退出的唯一方法是堆栈溢出。我们可以通过以下方式模拟效果:

public static void foo(int i)
{
    if(i>=N) return; // stack too deep

    foo(i+1);
    foo(i+1);
}
这对于最大堆栈深度来说是指数级的昂贵

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

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

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

完成程序的年数,给定或取一个常数:)

唯一可以退出的方法是堆栈溢出。我们可以通过以下方式模拟效果:

public static void foo(int i)
{
    if(i>=N) return; // stack too deep

    foo(i+1);
    foo(i+1);
}
这对于最大堆栈深度来说是指数级的昂贵

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

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

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

完成程序的年数,给定或取一个常数:)

您正在无限期地调用相同的方法。这意味着将抛出堆栈溢出错误

但是,因为您正在捕获它(不是一个例外,它是java.lang.Error,它是一个java.lang.Throwable),所以应用程序不会停止,它将继续递归,它根本不会停止

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


我知道我没有解释为什么会发生这种情况,我需要分析代码以获得更多信息,但这是一个有趣的问题,也许对JVM内部有深入了解的人确切地知道发生了什么

您正在无限期地调用相同的方法。这意味着将抛出堆栈溢出错误

但是,因为您正在捕获它(不是一个例外,它是java.lang.Error,它是一个java.lang.Throwable),所以应用程序不会停止,它将继续递归,它根本不会停止

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


我知道我没有解释为什么会发生这种情况,我需要分析代码以获得更多信息,但这是一个有趣的问题,也许对JVM内部有深入了解的人确切地知道发生了什么

看起来类似于这个问题:提供的@Trobbins链接应该解释这个行为。您没有得到异常,因为您的捕获是针对trowable的(意味着它将捕获几乎任何东西)。看起来与此问题类似:提供的链接@Trobbins应该解释此行为。您不会得到异常,因为您的捕获是针对trowable的(这意味着它将捕获几乎任何东西)。