Java — исключения
Исключение (или исключительное событие) — это проблема, возникающая во время выполнения программы. Когда Исключение происходит нарушение нормального хода программы и аварийное завершение программы/приложения, что не рекомендуется, поэтому эти исключения необходимо обрабатывать.
Исключение может возникнуть по разным причинам. Ниже приведены некоторые сценарии, в которых возникает исключение.
-
Пользователь ввел неверные данные.
-
Файл, который нужно открыть, не найден.
-
Сетевое подключение было потеряно во время обмена данными или JVM не хватило памяти.
Некоторые из этих исключений вызваны ошибкой пользователя, другие — ошибкой программиста, третьи — физическими ресурсами, которые каким-либо образом вышли из строя.
Исходя из этого, у нас есть три категории исключений. Вам нужно понять их, чтобы знать, как работает обработка исключений в Java.
-
Проверенные исключения − Проверяемое исключение — это исключение, которое проверяется (уведомляется) компилятором во время компиляции, они также называются исключениями времени компиляции. Эти исключения нельзя просто игнорировать, программист должен позаботиться об этих исключениях (обработать).
Например, если вы используете FileReader класс в вашей программе для чтения данных из файла, если файл, указанный в его конструкторе, не существует, то FileNotFoundException происходит, и компилятор предлагает программисту обработать исключение.
Пример
Живая демонстрация01
Если вы попытаетесь скомпилировать приведенную выше программу, вы получите следующие исключения.
Вывод
10пре>Примечание − Поскольку методы read() и закрыть() класса FileReader вызывает IOException, вы можете заметить, что компилятор уведомляет об обработке IOException вместе с FileNotFoundException.
-
Неотмеченные исключения − Непроверенное исключение — это исключение, возникающее во время выполнения. Их также называют исключениями во время выполнения. . К ним относятся программные ошибки, такие как логические ошибки или неправильное использование API. Исключения во время выполнения игнорируются во время компиляции.
Например, если вы объявили в своей программе массив размером 5 и пытаетесь вызвать 6 th элемент массива, затем исключение ArrayIndexOutOfBoundsExceptionException происходит.
Пример
Живая демонстрация28
Если вы скомпилируете и запустите приведенную выше программу, вы получите следующее исключение.
Вывод
32
-
Ошибки − Это вовсе не исключения, а проблемы, возникающие вне контроля пользователя или программиста. Ошибки обычно игнорируются в вашем коде, потому что вы редко можете что-то сделать с ошибкой. Например, если произойдет переполнение стека, возникнет ошибка. Они также игнорируются во время компиляции.
Иерархия исключений
Все классы исключений являются подтипами класса java.lang.Exception. Класс исключений является подклассом класса Throwable. Помимо класса исключений, существует еще один подкласс, называемый Error, который является производным от класса Throwable.
Ошибки — это ненормальные состояния, возникающие в случае серьезных сбоев, они не обрабатываются программами Java. Ошибки генерируются для указания на ошибки, генерируемые средой выполнения. Пример:JVM не хватает памяти. Обычно программы не могут восстановиться после ошибок.
Класс Exception имеет два основных подкласса:класс IOException и класс RuntimeException.
Ниже приведен список наиболее распространенных проверенных и непроверенных встроенных исключений Java.
Методы исключений
Ниже приведен список важных методов, доступных в классе Throwable.
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>|
5 | <тд>|
6 | <тд>
Перехват исключений
Метод перехватывает исключение, используя комбинацию try и поймать ключевые слова. Блок try/catch размещается вокруг кода, который может генерировать исключение. Код в блоке try/catch называется защищенным кодом, а синтаксис использования try/catch выглядит следующим образом —
Синтаксис
40
Код, который подвержен исключениям, помещается в блок try. Когда возникает исключение, оно обрабатывается связанным с ним блоком catch. За каждым блоком try должен сразу же следовать либо блок catch, либо блок finally.
Оператор catch включает объявление типа исключения, которое вы пытаетесь перехватить. Если в защищенном коде возникает исключение, проверяется блок (или блоки) catch, следующие за попыткой. Если тип возникшего исключения указан в блоке catch, исключение передается в блок catch так же, как аргумент передается в параметр метода.
Пример
Ниже приведен массив, объявленный с двумя элементами. Затем код пытается получить доступ к 3 rd элемент массива, вызывающий исключение.
Живая демонстрация58
Это даст следующий результат —
Вывод
61
Несколько блоков захвата
За блоком try может следовать несколько блоков catch. Синтаксис для нескольких блоков catch выглядит следующим образом:
Синтаксис
73
Предыдущие операторы демонстрируют три блока catch, но после одной попытки их может быть сколько угодно. Если в защищенном коде возникает исключение, оно выбрасывается в первый блок catch в списке. Если тип данных выброшенного исключения соответствует ExceptionType1, оно перехватывается там. Если нет, исключение передается второму оператору catch. Это продолжается до тех пор, пока исключение не будет перехвачено или не пройдет через все перехваты, и в этом случае текущий метод останавливает выполнение, и исключение передается предыдущему методу в стеке вызовов.
Пример
Вот фрагмент кода, показывающий, как использовать несколько операторов try/catch.
89
Перехват нескольких типов исключений
Начиная с Java 7 вы можете обрабатывать более одного исключения, используя один блок catch, эта функция упрощает код. Вот как бы вы это сделали —
99
Броски/Ключевые слова Throw
Если метод не обрабатывает проверенное исключение, метод должен объявить его с помощью throws ключевое слово. Ключевое слово throws появляется в конце сигнатуры метода.
Вы можете сгенерировать исключение, либо только что созданное, либо только что перехваченное, с помощью throw ключевое слово.
Попытайтесь понять разницу между ключевыми словами throws и throw, throws используется для отсрочки обработки проверенного исключения и throw используется для явного вызова исключения.
Следующий метод объявляет, что он генерирует исключение RemoteException —
Пример
107
Метод может объявить, что он генерирует более одного исключения, и в этом случае исключения объявляются в списке, разделенном запятыми. Например, следующий метод объявляет, что он генерирует RemoteException и InsufficientFundsException —
Пример
114
Окончательный блок
Блок finally следует за блоком try или блоком catch. Блок finally всегда выполняется независимо от возникновения исключения.
Использование блока finally позволяет запускать любые операторы очистки, которые вы хотите выполнить, независимо от того, что происходит в защищенном коде.
Блок finally появляется в конце блоков catch и имеет следующий синтаксис —
Синтаксис
129
Пример
Живая демонстрация134
Это даст следующий результат —
Вывод
146
Обратите внимание на следующее —
-
Предложение catch не может существовать без оператора try.
-
Не обязательно иметь предложения finally всякий раз, когда присутствует блок try/catch.
-
Блок try не может присутствовать без предложения catch или finally.
-
Никакой код не может находиться между блоками try, catch, finally.
Попытка использования ресурсов
Как правило, когда мы используем какие-либо ресурсы, такие как потоки, соединения и т. д., мы должны явно закрывать их с помощью блока finally. В следующей программе мы читаем данные из файла с помощью FileReader. и мы закрываем его с помощью блока finally.
Пример
159
попробовать-с-ресурсами , также называемое автоматическое управление ресурсами , — это новый механизм обработки исключений, представленный в Java 7, который автоматически закрывает ресурсы, используемые в блоке try catch.
Чтобы использовать этот оператор, вам просто нужно объявить требуемые ресурсы в скобках, и созданный ресурс будет автоматически закрыт в конце блока. Ниже приведен синтаксис оператора try-with-resources.
Синтаксис
165
Ниже приведена программа, которая считывает данные из файла с помощью оператора try-with-resources.
Пример
179
При работе с оператором try-with-resources необходимо помнить о следующих моментах.
-
Чтобы использовать класс с оператором try-with-resources, он должен реализовать AutoCloseable. интерфейс и close() его метод вызывается автоматически во время выполнения.
-
Вы можете объявить более одного класса в операторе try-with-resources.
-
Пока вы объявляете несколько классов в блоке try оператора try-with-resources, эти классы закрываются в обратном порядке.
-
За исключением объявления ресурсов в круглых скобках, все аналогично обычному блоку try/catch в блоке try.
-
Ресурс, объявленный в блоке try, создается непосредственно перед началом блока try.
-
Ресурс, объявленный в блоке try, неявно объявляется окончательным.
Пользовательские исключения
Вы можете создавать свои собственные исключения в Java. Помните о следующих моментах при написании собственных классов исключений —
-
Все исключения должны быть дочерними по отношению к Throwable.
-
Если вы хотите написать проверенное исключение, которое автоматически применяется правилом обработки или объявления, вам необходимо расширить класс Exception.
-
Если вы хотите написать исключение времени выполнения, вам необходимо расширить класс RuntimeException.
Мы можем определить наш собственный класс исключений, как показано ниже —
186
Вам просто нужно расширить предопределенное Exception класс для создания собственного исключения. Они считаются проверенными исключениями. Следующее InsufficientFundsException class — это определяемое пользователем исключение, которое расширяет класс Exception, делая его проверяемым исключением. Класс исключения, как и любой другой класс, содержит полезные поля и методы.
Пример
197
Чтобы продемонстрировать использование нашего пользовательского исключения, следующий класс CheckingAccount содержит метод remove(), который создает исключение InsufficientFundsException.
202
Следующая программа BankDemo демонстрирует вызов методов депозита() и снятия() CheckingAccount.
219
Скомпилируйте все три вышеуказанных файла и запустите BankDemo. Это даст следующий результат —
Вывод
229
Общие исключения
В Java можно определить две категории исключений и ошибок.
-
Исключения JVM − Это исключения/ошибки, которые исключительно или логически выдаются JVM. Примеры:NullPointerException, ArrayIndexOutOfBoundsException, ClassCastException.
-
Программные исключения − Эти исключения явно создаются приложением или программистами API. Примеры:IllegalArgumentException, IllegalStateException.
java