Обработка StackOverFlowError и восстановление Java
Может кто-нибудь объяснить, как работает StackOverFlowError?
Я знаю, что бесконечная рекурсия вызывает StackOverFlowError, но любой другой метод выполняется после заполнения стека? Я обработал ошибку в блоке catch. Я хотел бы знать, как Java работает или восстанавливается после ошибки, которая была поймана.
Образец кода:
public class Test {
public static void main(String[] args) {
try {
show();
} catch(StackruError e) {
System.out.println(e);
}
System.out.println("After StackOverFlowError");
display();
}
static void show() {
show();
}
static void display() {
System.out.println("Hello New Function");
}
}
И вывод:
java.lang.StackruError After StackOverFlowError Hello New Function
2 ответа
Да, ява восстановилась от этого. Когда генерируется StackruError, он раскручивает стек через все методы show(), пока не вернется к блоку catch. На данный момент в стеке остается только main(), и вы можете продолжить выполнение вашей программы без проблем.
Ваш стек вызовов будет выглядеть так:
main()
show()
show()
show()...
Как бы глубоко ваша стековая память ни позволяла ему идти, когда последний метод show() получает исключение, он выбрасывает его в каждый метод show, который перезагружает его до тех пор, пока он не достигнет блока catch в вашем main и не будет напечатана ошибка.
Как сказал Тим, вы не обрабатываете StackruError, вместо этого, если это возможно, попробуйте лучший подход, такой как итерация, или завершите стек вызовов после нескольких вызовов.