これが最終的に終了するという合理的な証拠を提供するために、次のかなり意味のないコードを提供します。注:Javaは私の言語ではありません。私は、ピーターの答えは、サポートするためにのみこれを差し出す質問に対する正しい答えを。
これは、スタックオーバーフローが発生するために呼び出しが発生しない場合の状況をシミュレートしようとします。難しいことの人々は、それはときに、invokeが起こらないということで把握するために失敗しているように思えることはできませんが起こります。
public class Main
{
public static void main(String[] args)
{
try
{ // invoke foo() with a simulated call depth
Main.foo(1,5);
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
}
public static void foo(int n, int limit) throws Exception
{
try
{ // simulate a depth limited call stack
System.out.println(n + " - Try");
if (n < limit)
foo(n+1,limit);
else
throw new Exception("StackOverflow@try("+n+")");
}
finally
{
System.out.println(n + " - Finally");
if (n < limit)
foo(n+1,limit);
else
throw new Exception("StackOverflow@finally("+n+")");
}
}
}
この小さな無意味なgooの山の出力は次のとおりです。実際にキャッチされた例外は、驚くかもしれません。ああ、そして完全に予想される32回のtry-calls(2 ^ 5):
1 - Try
2 - Try
3 - Try
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
3 - Finally
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
2 - Finally
3 - Try
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
3 - Finally
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
1 - Finally
2 - Try
3 - Try
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
3 - Finally
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
2 - Finally
3 - Try
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
3 - Finally
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
java.lang.Exception: StackOverflow@finally(5)
finally
句の処理中にスローされたエラーが次のレベルに伝播するため、プログラムは最終的に停止します。しかし、息を止めないでください。実行されるステップの数は(最大スタック深度)に対して約2であり、例外のスローも厳密には安くはありません。