【发布时间】:2014-04-03 10:08:01
【问题描述】:
我很惊讶即使在 Java 中出现StackOverflowError 之后仍然可以继续执行。
我知道StackOverflowError 是Error 类的子类。
类 Error 被删除为“Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。”
这听起来更像是一个建议而不是规则,实际上允许捕获像 StackOverflowError 这样的错误,并且不这样做取决于程序员的合理性。你看,我测试了这段代码,它正常终止了。
public class Test
{
public static void main(String[] args)
{
try {
foo();
} catch (StackOverflowError e) {
bar();
}
System.out.println("normal termination");
}
private static void foo() {
System.out.println("foo");
foo();
}
private static void bar() {
System.out.println("bar");
}
}
这怎么可能?我认为当 StackOverflowError 被抛出时,堆栈应该已经满了,以至于没有空间调用另一个函数。错误处理块是否在不同的堆栈中运行,或者这里发生了什么?
【问题讨论】:
-
我总是在 StackOverflow 上出错。但这并不能阻止我回来。
-
Yo dawg...我听说你喜欢堆栈溢出,所以我们在你的 stackoverflow.com 中放置了一个堆栈溢出!
-
因为现代架构使用帧指针来促进展开堆栈,甚至是部分堆栈。只要执行此操作的代码+上下文不必从堆栈中动态分配,就不会有问题。
标签: java stack-overflow