## Проявление ошибок - На этапе компиляции - проверяет компилятор - синтаксические ошибки - ошибки типов данных - На этапе выполнения - возникают во время работы - отсутствие ресурса - ошибки данных - логические ошибки ## Система исключений - Специальный объект - исключение - создается системой ([[JVM]]) или программой (`new`) - выбрасывается (`throw`) - требует обработки в коде - `try` - код, где может возникнуть - `catch` - код, отлавливающий исключение - `finally` - код, завершающий обработку ## Иерархия классов исключений ![[Exceptions.png]] ## Unchecked - Непроверяемое или неконтроллируемое исключение - Компилятору все равно, обработано или нет - Выбрасывается виртуальной машиной - Класс `RuntimeException` и его потомки: - Проблема в коде - Можно обработать - Класс `Error` и его потомки - Критическая ошибка - Можно обработать, но уже поздно ## Checked - Проверяемое или контролируемое исключение - Обычно явно выбрасывается в программе - Вызывается внешними причинами - Компилятор проверяет, что про него не забыли: catch or throw - Если понятно, что делать - обработать - Если нет - передать выше ## try-catch-finally ```Java try { // проблемный код } catch (Exception e) { // e - объект ошибки } finally { // всегда выполнится } ``` > [!hint] Можно писать `IOException | MyException | ... e` > Для игнора: `Exception _` ## Проброс исключения Через ключевое слово `throws` ```Java void method() throws Exception { } ``` Исключение пробрасывается, пока не будет поймано, либо в `main`, а оттуда вылет с программы P.S. можно писать как для checked, так и для unchecked ## try-with-resources Автозакрытие ресурсов - интерфейс `AutoCloseable` ```Java try (File f = open("name")) { int x = f.readInt(); result = 1 / x; calculate(result); } catch (IOException e) { // ... } // не надо писать finally для закрытия файла ```