【发布时间】:2012-09-08 11:03:36
【问题描述】:
看看下面两种方法:
public static void foo() {
try {
foo();
} finally {
foo();
}
}
public static void bar() {
bar();
}
运行bar() 显然会导致StackOverflowError,但运行foo() 不会(程序似乎无限期地运行)。 为什么会这样?
【问题讨论】:
-
正式地,程序最终将停止,因为在处理
finally子句期间抛出的错误将传播到下一个级别。但不要屏住呼吸;所采取的步骤数大约是(最大堆栈深度)的 2 倍,并且抛出异常也不便宜。 -
不过,
bar()是“正确的”。 -
@dan04:Java 不做 TCO、IIRC 以确保拥有完整的堆栈跟踪,以及与反射相关的事情(可能也与堆栈跟踪有关)。
-
有趣的是,当我在 .Net 上尝试这个(使用 Mono)时,程序在没有调用 finally 的情况下因 StackOverflow 错误而崩溃。
-
这是我见过的最糟糕的一段代码:)
标签: java recursion stack-overflow try-finally