[英]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.