Исключения

Тема дорожной карты · Java

Исключения в Java — это объекты, представляющие аномальные условия, нарушающие нормальный ход программы; механизм исключений JVM является основным способом сигнализации и обработки ошибок структурированным, типобезопасным образом. Все исключения в Java образуют иерархию с корнем Throwable, ветвящуюся на Error (невосстановимые проблемы уровня JVM, такие как OutOfMemoryError и StackOverflowError) и Exception (проблемы уровня приложения, подразделяемые на проверяемые исключения и непроверяемые подклассы RuntimeException). Конструкция try-catch-finally является основой обработки исключений: блок try содержит код, который может бросить исключение, один или несколько блоков catch обрабатывают конкретные типы исключений, используя полиморфизм, а блок finally выполняется безусловно для очистки — заменяется конструкцией try-with-resources для AutoCloseable-объектов вроде JDBC Connection и PreparedStatement. В Java 7 появился множественный перехват (catch (IOException | SQLException e)) для уменьшения шаблонного кода, а различие между throw и throws принципиально: throw бросает экземпляр исключения, тогда как throws объявляет в сигнатуре метода, что проверяемое исключение может распространиться к вызывающему коду. Исключения Java глубоко интегрированы со всей экосистемой: иерархия DataAccessException Spring оборачивает JDBC-исключения, PersistenceException JPA оборачивает ошибки Hibernate, а assertThrows из JUnit 5 и assertThatThrownBy из AssertJ предоставляют чистые, удобные для тестирования способы проверки поведения исключений.

Как это работает

Исключения делится на checked (нужно объявить или обработать — IOException, SQLException) и unchecked (RuntimeException — NullPointerException, IllegalArgumentException). try { } catch (...) { } finally { } или try-with-resources (try (var x = ...) { }) для AutoCloseable-типов — рекомендуется для файлов/сокетов/соединений. Multi-catch (catch (IOException | SQLException e)) сокращает дублирование. Всегда сохраняйте cause (throw new MyException(msg, cause)).

Когда применять

Checked exceptions — для восстановимых условий в API библиотек (вызывающий решает); unchecked (RuntimeException) — для программных ошибок. Оборачивайте checked exceptions на границах модулей, чтобы stack trace upstream оставался чистым. try-with-resources — для всего AutoCloseable. Логируйте с throwable (log.error("...", e)) — slf4j отформатирует со stack trace.

Типичные ошибки

Ловушки Исключения: catch (Exception e) { } тихо съедает каждую ошибку (тихий убийца); checked exceptions для того, что должно быть runtime-ошибкой (многословные declarations повсюду); rewrap exception теряет cause (throw new MyException(msg) без e — stack trace пропал); finally-блок, бросающий exception (оригинальное теряется).

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…