Я удивлен тем, как можно продолжить выполнение даже после того, как StackOverflowError
произошел в Java.
Я знаю, что StackOverflowError
является подслоем класса 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 будет сброшен, стек должен быть настолько полным, что нет места для вызова другой функции. Является ли блок обработки ошибок запущенным в другом стеке или что здесь происходит?