Как получить исключение StackOverflowError в Java?

«Как получить исключение StackOverflowError в Java?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java StackOverflowError возникает при переполнении стека вызовов, что чаще всего является следствием неконтролируемой или слишком глубокой рекурсии.

Классический пример — рекурсия без условия выхода:

public class StackOverflowDemo {
    public static void main(String[] args) {
        recursiveMethod(); // Запуск бесконечной рекурсии
    }

    static void recursiveMethod() {
        recursiveMethod(); // Каждый вызов добавляет новый кадр в стек
    }
}

Другие частые причины:

  1. Взаимная рекурсия: Метод A() вызывает B(), а B() снова вызывает A().
  2. Глубокие, но корректные рекурсивные структуры: Обработка очень большого дерева или графа может исчерпать стек, даже если есть условие выхода.

Как избежать:

  • Всегда проверяйте наличие базового случая (base case) в рекурсивных алгоритмах.
  • Для задач, которые можно решить итеративно (обход коллекций, вычисление факториала для небольших чисел), предпочитайте циклы.
  • Если глубокая рекурсия неизбежна (например, обход файловой системы), рассмотрите возможность увеличения размера стека JVM с помощью параметра -Xss, но это временное решение, маскирующее проблему дизайна.