Корень иерархии — Throwable. RuntimeException и Error вместе со своими наследниками относятся к unchecked: компилятор не требует их catch или throws. Остальные наследники Throwable — checked; обычно это Exception без ветви RuntimeException. Checked нужно перехватить либо объявить в throws. Error не является подклассом Exception, поэтому catch (Exception e) его не ловит.
Какие разновидности исключений есть в Java и чем они отличаются?
Иерархия Throwable, проверяемые и непроверяемые исключения, место Error и разница между проверкой компилятором и обработкой во время выполнения.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В 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.