Что представляет собой класс Error в иерархии исключений Java и как с ним следует обращаться?

«Что представляет собой класс Error в иерархии исключений Java и как с ним следует обращаться?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Класс java.lang.Error представляет собой непроверяемое (unchecked) исключение, которое сигнализирует о критических проблемах в среде выполнения Java (JVM), которые приложение, как правило, не должно пытаться обрабатывать.

Ключевые отличия от Exception: Аспект Error Exception (проверяемое)
Причина Серьезные системные сбои (JVM, ресурсы). Проблемы в логике приложения или внешних взаимодействиях.
Обработка Обрабатывать не рекомендуется. Обработка ожидается (через try-catch или throws).
Наследование ThrowableError ThrowableException ← ...

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

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

Правила обработки:

  1. Не ловите Error для обычного восстановления работы приложения. Это маскирует фатальные проблемы.
  2. В некоторых сценариях (например, в серверных приложениях) можно поймать Error на верхнем уровне, чтобы аккуратно залогировать ошибку и завершить процесс, предотвращая дальнейшую порчу состояния.

Пример:

public class ErrorDemo {
    public static void main(String[] args) {
        // Вызовет StackOverflowError - непроверяемое исключение типа Error
        recursiveMethod(1);
    }

    private static void recursiveMethod(int i) {
        // Отсутствие условия остановки -> бесконечная рекурсия -> Error
        recursiveMethod(i + 1);
    }
}
// Попытка поймать Error (НЕ РЕКОМЕНДУЕТСЯ для бизнес-логики):
try {
    someCriticalOperation();
} catch (OutOfMemoryError e) {
    // Логирование и принудительное завершение
    log.fatal("JVM out of memory", e);
    System.exit(1);
}