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

Другие вопросы по тегам