Чем Error отличается от Exception в Java?

Ответ

В Java Error и Exception — это подклассы Throwable, но они предназначены для принципиально разных ситуаций.

Критерий Error Exception (Checked & Unchecked)
Природа Критические, непоправимые проблемы в среде выполнения JVM (например, нехватка системных ресурсов). Проблемы в логике приложения, которые можно предвидеть и обработать.
Обработка Не рекомендуется перехватывать (try-catch). Программа не может восстановиться после них. Предназначены для перехвата и обработки (try-catch-finally).
Наследование java.lang.Error (e.g., VirtualMachineError, LinkageError). java.lang.Exception (e.g., IOException, RuntimeException).

Примеры Error:

  • OutOfMemoryError: JVM исчерпала память в Heap.
  • StackOverflowError: Переполнение стека вызовов (часто из-за бесконечной рекурсии).
  • NoClassDefFoundError: JVM не нашла определение класса во время выполнения.

Пример кода, приводящего к Error:

public class ErrorExample {
    public static void main(String[] args) {
        // Бесконечная рекурсия -> StackOverflowError
        recursiveMethod();
    }
    static void recursiveMethod() {
        recursiveMethod(); // Вызывает саму себя без условия выхода
    }
}

Вывод: Error сигнализирует о фатальных проблемах системы, а Exception — об ошибках в бизнес-логике, которые приложение должно корректно обрабатывать.

Ответ 18+ 🔞

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

Представь себе, что Throwable — это такой общий предок, ёпта, отец-основатель всех проблем в джаве. И у него два сына: один — отъявленный дегенерат и саботажник, а второй — просто распиздяй, но в целом исправимый.

Первый сын — это Error. Это, блядь, натуральный психопат. Он приходит тогда, когда у виртуальной машины, сука, крыша едет окончательно. Ты ему не скажешь: «Слушай, давай договоримся». Не договоришься, пиздец. Это как если бы у тебя в квартире внезапно фундамент треснул или потолок обвалился — ты ж не будешь его скотчем заклеивать, ты просто свалишь нахуй. Вот Error — это такие фундаментальные пиздецы: памяти нет (OutOfMemoryError), стек переполнился от твоей же бесконечной рекурсии (StackOverflowError), или JVM ищет класс, а его, блядь, нет, как прошлогоднего снега (NoClassDefFoundError). Ловить их в try-catch — это всё равно что пытаться остановить падающий самолёт, выставив в иллюминатор хуй. Бесполезно и некрасиво.

public class Samoubiytsa {
    public static void main(String[] args) {
        // Сейчас вызовем метод, который себя любит до потери пульса
        samolyubov();
    }
    static void samolyubov() {
        samolyubov(); // И так по кругу, пока стек не скажет "я устал, я мухожук"
    }
}

Запустишь эту хуйню — и тебе JVM любезно намекнёт: StackOverflowError, дружок-пирожок. Это не ошибка программы, это, блядь, крик души процессора: «ХУЛИ ТЫ МЕНЯ ЗАЕБАЛ?!»

А второй сын — Exception. Ну, этот уже полегче. Это не системный крах, а просто твой код накосячил в логике. Сломалось что-то в твоём, сука, царстве-государстве. Файл не найден? IOException. На ноль поделил? ArithmeticException. Индекс за границы массива полез? ArrayIndexOutOfBoundsException. Вот это всё — его рук дело. И его, в отличие от психа-брата, можно и нужно ловить, обрабатывать, успокаивать. Программа после этого может жить дальше, как ни в чём не бывало.

Так что запомни, как «Отче наш»:

  • Error — это пиздец системы, JVM ебнулась. Ты не виноват, но и сделать нихуя не можешь. Смирись.
  • Exception — это твои личные косяки в коде. Ты виноват, но ты можешь их исправить, обработать и двигаться дальше.

Короче, если видишь Error — готовься к похоронам процесса. Если Exception — доставай аптечку и латай свою, блядь, логику.