Какое исключение возникает при переполнении стека вызовов в Java?

Ответ

При переполнении стека вызовов (stack) возникает ошибка StackOverflowError.

Причина: Каждый вызов метода выделяет в стеке кадр (frame) для локальных переменных, параметров и адреса возврата. При глубокой или бесконечной рекурсии эти кадры исчерпывают выделенную для стека память.

Типичный пример:

public class OverflowExample {
    public static void recursiveCall() {
        recursiveCall(); // Бесконечная рекурсия
    }
    public static void main(String[] args) {
        recursiveCall(); // Вызовет StackOverflowError
    }
}
Ключевые отличия от OutOfMemoryError: StackOverflowError OutOfMemoryError
Связан с областью памяти стек (stack). Связан с областью памяти куча (heap).
Возникает из-за слишком глубокой рекурсии. Возникает, когда JVM не может выделить память под новый объект.
Обычно указывает на логическую ошибку (бесконечный вызов). Часто указывает на проблему с настройками памяти или утечку.

Ответ 18+ 🔞

А, слушай, вот эта хуйня со стеком! Прям классика, блядь. Представь себе: стек — это как стопка тарелок на кухне, только для вызовов методов. Каждый раз, когда ты вызываешь метод, сверху кладётся новая тарелка с локальными переменными и прочей хуйней. А когда метод заканчивается — тарелку снимают.

Так вот, если ты, мудак, написал рекурсию без выхода, то эти тарелки начинают пихать одну на другую до овердохуища. В какой-то момент стопка до потолка дорастёт и — пиздец! — StackOverflowError тебе в сраку. Вся память, выделенная под стек, кончилась.

Самый идиотский пример, от которого волосы дыбом встают:

public class OverflowExample {
    public static void recursiveCall() {
        recursiveCall(); // Давай, вызывай себя, умник! Бесконечный цирк!
    }
    public static void main(String[] args) {
        recursiveCall(); // И пошла писать губерния...
    }
}

Запустишь эту дичь — и через секунду JVM тебе такую оплеуху выдаст, мама не горюй. "Хули ты творишь, еблан? Стек переполнен!"

И главное, не путай, ёпта, с другой ошибкой — OutOfMemoryError. Это две большие разницы, как говорят в Одессе.

StackOverflowError OutOfMemoryError
Это про стек, про те самые тарелки с вызовами. А это уже про кучу (heap), где объекты твои живут.
Ты, кретин, слишком глубоко зарекурсился. Логическая ошибка, блядь. А тут JVM не может новый объект создать, места нет. Либо ты память жрёт как не в себя, либо настройки кривые.
Исправляй алгоритм, дебил. Увеличивай память или ищи утечки, долбоёб.

Вот и вся наука. Не делай бесконечную рекурсию, и будет тебе счастье. А то ведь доверия к тебе, блядь, ноль после таких фокусов.