Очищает ли JVM стек вызовов после StackOverflowError?

96
07 января 2021, 08:00

Пусть N это N-ое число Фибоначчи, при вычислении которого возникает переполнение стека вызовов, а K это K-ое число Фибоначчи, которое будет вычислено успешно.

public static void main(String[] args) {
   try {
        fib(N);
    } catch (StackOverflowError e) {
        fib(K);
    }     
}
public static long fib(long n) {
        if(n == 0) return 0;
        if(n == 1) return 1;
        return fib(n - 2) + fib(n - 1);
}

При первом вызове fib(N) стек переполняется, так почему же становится возможным дальнейший вызов fib(K) при переполненным стеке?

Answer 1

Исключение всплывёт через все кадры стека, завершая выполнение соответствующих вызовов. Следовательно, в момент срабатывания блока catch в стеке будет только кадр метода main.

READ ALSO
Шифрование строк для защиты Android приложений

Шифрование строк для защиты Android приложений

я уже готовлюсь выложить приложение в Google Play и теперь мне надо защитить свое приложение от взлома и дрЯ уже настроил Proguard, обфускация работает

96
Не работает сохранение байтов в файл

Не работает сохранение байтов в файл

Пытаюсь сохранить байты в файл

103
Аналог synchronized

Аналог synchronized

Имеется таскНужно реализовать многопоточное приложение, без использования synchronized

99
Падает тест java.lang.AssertionError

Падает тест java.lang.AssertionError

При использовании AssertassertEquals падает тест, из-за того что после листа expected добавляется пробел(непонятно почему)

114