Примеры в этой статье описывают использование обработки исключений Java. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
Механизм обработки исключений Java может помочь нам избежать или обработать ошибки, которые могут возникнуть в программе, чтобы программа не завершалась неожиданно при обнаружении некоторых устранимых ошибок, но и могла обрабатывать эти ошибки, что также помогает нам лучше писать программы. необходимо писать много кода для проверки ошибочных состояний, что повышает читаемость и логику кода. В Java исключение представляет собой неправильный объект сущности.
Исключения можно разделить на две категории: одна — это серьезные ошибки, такие как аппаратные ошибки, нехватка памяти и т. д., которые соответствуют классу Error и его подклассам в пакете java.lang. Обычно этот тип ошибок программы сам по себе не подлежит восстановлению и требует прерывания выполнения программы; другой тип — это несерьезные ошибки, такие как ввод пользователем недопустимых данных, деление на 0 и т. д. Они соответствуют классу Exception и исключения в пакете подкласса java.lang, ошибки такого рода, как правило, можно устранить, не влияя на работу программы.
Мы можем использовать ключевые слова try, catch и, наконец, для перехвата исключений.
1. попробовать, поймать
Поместите операторы, которые могут вызвать исключения, в блок try{}, а затем перехватите их в блоке операторов catch{}. Исключение при делении на 0:
public class SimpleDemo { //Операция деления public static int devision(int a,int b) { return a / b; } public static void main(String[] args) { try { //5 делим на 0 SimpleDemo.devision(5 ,0); System.out.println("Исключение"); } catch (Exception e) { e.printStackTrace() } System.out.println("Готово" } );Результат выполнения:
Как видите, выводится сообщение Finish, указывающее, что программа не завершилась из-за ошибки деления на 0.
В то же время мы также обнаружили, что оператор System.out.println в SimpleDemo.devision(), где произошло исключение, не был выполнен. При возникновении исключения программа выйдет из текущей позиции выполнения, не выполняя инструкции, следующие за исключением.
2. наконец
Операторы в блокеfinally будут выполняться независимо от возникновения исключения.
Кто-то может спросить: поскольку операторы в блокеfinally будут выполняться независимо от того, возникнет ли исключение, то каков же практический эффект от этого, наконец? Разве я не могу написать это прямо снаружи, без наконец?
Как и в приведенном выше примере, мы добавляем возврат в блок операторов catch:
public class SimpleDemo { //Операция деления public static int Division(int a,int b) { return a / b; } public static void main(String[] args) { try { //5 делим на 0 SimpleDemo.division(5 ,0); System.out.println("Исключение"); } catch (Exception e) { e.printStackTrace(); // основная функция возвращает} наконец { System.out.println("Наконец-то" } System.out.println("Готово");В это время Finish вне блока Final не печатается, но печатается Final внутри блока Final.
наконец очень полезен в реальной разработке. Например, если мы открываем базу данных и при чтении и записи данных в базе возникает исключение, то нам следует закрыть соединение с базой данных и освободить соответствующие ресурсы. На данный момент наиболее уместно написать код освобождения ресурсов в блокеfinally.
Но следует отметить, что блокfinally не будет выполнен ни в одном случае. Если программа завершает работу до выполнения блока «finally», например, при вызове метода System.exit(), блок «finally» не сможет выполниться.
3. Вызов исключения
Если в методе возникает исключение, но мы не хотим обрабатывать исключение непосредственно в методе, а хотим, чтобы его обрабатывал вызывающий метод, мы можем использовать ключевое слово throws, чтобы объявить этот метод для генерации исключения. Это очень часто встречается в функциях API, предоставляемых Sun. Например, объявлен метод чтения в java.io.Reader, вызывающий исключение IOException:
public int read(char[] cbuf) выдает IOException
В это время, когда мы вызываем метод read, мы должны поместить его в блок операторов try для перехвата исключений, иначе компилятор сообщит об ошибке и заставит нас перехватывать исключения.
Конечно, если мы действительно не хотим обрабатывать исключения при вызове чтения, мы также можем объявить метод, который вызывает метод чтения, как генерирующий IOException, чтобы исключение было сгенерировано снова. Если мы объявим исключение в основной функции, информация об исключении в конечном итоге будет перехвачена и обработана JVM, а результатом обработки JVM будет распечатка информации об исключении и последующее завершение программы.
4. Структура обработки исключений
Все классы исключений являются производными от класса Exception. Это означает, что если мы не уверены, какой тип исключения произойдет, мы можем напрямую объявить объект Exception в catch, чтобы перехватывать все исключения класса Exception и его подклассов. Но обратите внимание на порядок написания catch. Если после попытки имеется несколько перехватов и первый перехват объявляет объект Exception, то исключение будет обработано непосредственно первым перехватом, и последующие перехваты не смогут перехватить это исключение. Ошибка такого рода приведет к возникновению ошибки во время компиляции. Например:
public class CatchDemo { //Операция разделения public static int Division(int a,int b) { return a / b; } public static void main(String[] args) { try { CatchDemo.division(4,0 } catch); (Исключение e) { System.out.println("Класс исключения" } catch(ArithmeticException e) { System.out.println("Класс ArithmeticException"); } } }Компилятор выводит, что ArithmeticException перехвачен, а это означает, что указанное выше исключение перехватило это исключение и нет необходимости перехватывать его снова.
Что произойдет, если эти два улова поменяются местами?
public class CatchDemo { //Операция разделения public static int Division(int a,int b) { return a / b; } public static void main(String[] args) { try { CatchDemo.division(4,0 } catch); (ArithmeticException e) { System.out.println("Класс ArithmeticException" } catch(Exception e) { System.out.println("Класс исключения"); } } }В этот раз мы обнаружили, что код прошел компиляцию, и в результате выполнения ArithmeticException перехватил это исключение, но последующий перехват его не перехватил.
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.