Ответ
В Java StackOverflowError возникает при переполнении стека вызовов, что чаще всего является следствием неконтролируемой или слишком глубокой рекурсии.
Классический пример — рекурсия без условия выхода:
public class StackOverflowDemo {
public static void main(String[] args) {
recursiveMethod(); // Запуск бесконечной рекурсии
}
static void recursiveMethod() {
recursiveMethod(); // Каждый вызов добавляет новый кадр в стек
}
}
Другие частые причины:
- Взаимная рекурсия: Метод
A()вызываетB(), аB()снова вызываетA(). - Глубокие, но корректные рекурсивные структуры: Обработка очень большого дерева или графа может исчерпать стек, даже если есть условие выхода.
Как избежать:
- Всегда проверяйте наличие базового случая (base case) в рекурсивных алгоритмах.
- Для задач, которые можно решить итеративно (обход коллекций, вычисление факториала для небольших чисел), предпочитайте циклы.
- Если глубокая рекурсия неизбежна (например, обход файловой системы), рассмотрите возможность увеличения размера стека JVM с помощью параметра
-Xss, но это временное решение, маскирующее проблему дизайна.