我很惊讶即使StackOverflowError
在Java中发生故障后仍可以继续执行。
我知道那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时,堆栈应该已满,以至于没有空间可以调用另一个函数。错误处理块是在其他堆栈中运行还是在这里发生了什么?