Чем checked-исключения отличаются от unchecked?
- Checked или unchecked — как решить, какое исключение бросать, и как правильно его обрабатывать?
- Checked или unchecked: как решаешь, какое исключение бросать, и как правильно его обрабатывать?
Checked (наследники Exception, кроме RuntimeException) компилятор требует объявить в throws или обработать. Unchecked (RuntimeException и Error) — нет. Выбор: checked — когда вызывающий может осмысленно отреагировать, unchecked — для багов и нарушений контракта.
- Checked: IOException, SQLException; unchecked: NullPointerException, IllegalArgumentException
- Современные фреймворки (Spring) почти всё делают unchecked
- Checked плохо сочетаются с лямбдами и стримами
А ещё Главное в обработке: не глотать и не терять причину (cause)
Подробно
Иерархия: Throwable → Error (фатальное для JVM) и Exception; RuntimeException наследует Exception. Checked = Exception минус ветка RuntimeException.
Критерий выбора:
- вызывающий может восстановиться (файл не найден — спросить другой путь; платёж отклонён — показать пользователю) — checked заставит его об этом подумать;
- ошибка программиста или нарушение контракта (null-аргумент, неверный индекс) — unchecked: обрабатывать её в каждом месте бессмысленно.
Критика checked: засоряют сигнатуры, протекают через слои (SQLException из сервиса), не работают с Function в стримах. Поэтому в Spring принято оборачивать в unchecked (DataAccessException).
Правила обработки:
- не глотать: пустой
catchскрывает сбой; - оборачивая, передавать причину:
throw new ServiceException("...", e); - ловить там, где можно что-то сделать, иначе пробрасывать;
- логировать один раз, на границе, а не на каждом уровне;
- не ловить
Exceptionи тем болееThrowableбез необходимости.
Что хотят услышать
- Различие и иерархия.
- Критерий выбора.
- Правила обработки: не глотать, сохранять cause.
Частые ошибки
- Считать Error разновидностью checked.
- Глотать исключения пустым catch.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Checked проверяет компилятор (нужен throws или catch), unchecked — нет
- ✗Unchecked обязательно объявлять в throws, а checked — нет
- ✗Checked нельзя поймать, unchecked можно
- ✗Это одно и то же
Что спросят дальше
- Что такое try-with-resources?
- Когда оправдан собственный тип исключения?
- Почему многие современные фреймворки предпочитают unchecked?
- Что происходит с исключением, брошенным в блоке finally?
Разбор темы
- Исключения: иерархия и checked/unchecked
Дерево Throwable, философия checked против unchecked, раскрутка стека и стоимость, цепочки причин и практики обработки.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.