簡體   English   中英

try-catch語句中的遞歸調用

[英]Recursive call in the try-catch statement

我有以下代碼片段:

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可以退出的唯一方法是因為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 

年完成該計划,給予或采用恆定因子:)

您正在無限期地調用相同的方法。 這意味着將引發StackOverflowError。

但是因為您正在捕獲它( StackOverflowError也不例外,所以它是java.lang.Error,這是一個java.lang.Throwable),應用程序將不會停止,它將繼續遞歸,也將不會停止。

當我嘗試將堆棧大小減小到最小( -Xss160k -Xoss1k )時,它沒有幫助。

我知道我沒有提供解釋為什么會發生這種情況,我需要分析代碼以獲取更多信息,但這是一個有趣的問題,也許對JVM內部有很深專業知識的人都知道發生了什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM