Какие разновидности исключений есть в Java и чем они отличаются?

Иерархия Throwable, проверяемые и непроверяемые исключения, место Error и разница между проверкой компилятором и обработкой во время выполнения.

Короткий ответ

Что ответить на собеседовании

Корень иерархии — Throwable. RuntimeException и Error вместе со своими наследниками относятся к unchecked: компилятор не требует их catch или throws. Остальные наследники Throwable — checked; обычно это Exception без ветви RuntimeException. Checked нужно перехватить либо объявить в throws. Error не является подклассом Exception, поэтому catch (Exception e) его не ловит.

Подробный разбор

Ответ с пояснениями

В Java бросать можно объекты Throwable и его наследников. Две основные ветви стандартной иерархии — Exception и Error; RuntimeException наследуется от Exception.

По проверке компилятором исключения делятся на checked и unchecked:

  • Checked: компилятор требует перехватить возможное исключение или объявить его распространение в throws. Типичные примеры — IOException и SQLException. Это делает потенциальный отказ частью контракта метода.
  • Unchecked, ветвь RuntimeException: NullPointerException, IllegalArgumentException, IndexOutOfBoundsException. Обязательных catch или throws нет, хотя исключение можно перехватить или документировать. Многие такие ситуации связаны с нарушением предусловий, но это не универсальное описание всех runtime-исключений.
  • Unchecked, ветвь Error: например, OutOfMemoryError, StackOverflowError, LinkageError. Обычная прикладная логика, как правило, не должна рассчитывать на нормальное продолжение работы после подобных сбоев. Формальная классификация дана в JLS, глава 11.

Важная точность: checked — не только наследники Exception. Сам Throwable и его пользовательские наследники вне ветвей RuntimeException и Error также являются checked. На практике собственные прикладные исключения обычно наследуют от Exception или RuntimeException, а не непосредственно от корня. Документация Throwable.

Слово checked не означает, что ошибка возникает при компиляции: обе группы выбрасываются во время выполнения. Проверяется лишь обязанность обработать или объявить исключение.

catch (Exception e) ловит и checked-наследников Exception, и RuntimeException, но не Error. catch (Throwable t) охватывает обе ветви и прямых наследников, поэтому слишком широк для обычной обработки. Перехват Error технически возможен, но игнорировать его и продолжать работу без понимания последствий опасно. Документация Error.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку