即使在 Java 中发生了 StackOverflowError
之后,仍然可以继续执行,我对此感到惊讶。
我知道 StackOverflowError
是 Error 类的子类。
类 Error 被转化为“ Throwable 的一个子类,它指示一个合理的应用程序不应该试图捕捉的严重问题。”
这听起来更像是一个建议而不是一个规则,意味着像 StackOverlowError 那样捕获 Error 实际上是允许的,而不这样做取决于程序员的合理性。看,我测试了这个代码,它正常终止。
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");
}
}
怎么会这样?我认为在抛出 StackOverlowError 时,堆栈应该已经满了,没有空间调用另一个函数了。错误处理块是否运行在不同的堆栈中,或者这里发生了什么?