Введение
Исключение Java — это объект, который описывает исключительное (то есть, ошибку) условие, возникшее в фрагменте кода. Когда возникает исключительное условие, объект, представляющий это исключение, создается и выдается в методе, вызвавшем ошибку. Этот метод может решить обработать само исключение или передать его. В любом случае, в какой-то момент исключение перехватывается и обрабатывается.
Программы, которые вы пишете, могут генерировать множество типов потенциальных исключений, например, когда вы делаете следующее:
В Java существует три типа циклов:
- Вы вводите команду для чтения файла с диска, но файл там не существует.
- Вы пытаетесь записать данные на диск, но диск заполнен или не отформатирован.
- Ваша программа запрашивает ввод данных пользователем, но пользователь вводит недопустимые данные.
- Программа пытается разделить значение на 0, получить доступ к массиву со слишком большим нижним индексом или вычислить значение, слишком большое для типа переменной ответа.
Эти ошибки называются исключениями, потому что, по-видимому, они возникают нечасто; они «исключительны». Объектно-ориентированные методы управления такими ошибками включают группу методов, известных как обработка исключений.
Обработка исключений работает путем передачи выполнения программы соответствующему обработчику исключений при возникновении исключения. Давайте возьмем пример программы, которая берет два числа от пользователя и выводит результат деления на экран. Это может привести к состоянию исключения, если знаменатель равен нулю.
Код Java: перейдите в редактор
import java.util.Scanner; открытый класс DivideExceptionDemo {public static void main (String [] args ) {//Класс сканера является классом оболочки System.in objectScanner inputDevice = new Scanner (System.in); System.out.print ("Пожалуйста, введите первое число (числитель):"); int numerator = inputDevice.nextInt () ; System.out.print ("Пожалуйста, введите второе число (знаменатель):"); int denominator = inputDevice.nextInt (); new DivideExceptionDemo (). DoDivide (числитель, знаменатель);} public void doDivide (int a, int b ) {float result = a/b; System.out.println ("Результат деления" + a + "/" + b + "=" + result);}}
Вывод:
Вывод на основе комбинаций пользовательского ввода:
Обработка исключений:
Есть два способа обработки исключения: сначала перехватить исключение и предпринять корректирующие действия или выбросить исключение в вызывающий метод что заставит вызывающий метод использовать h и оставь это.
- В приведенной выше программе выполнение является неожиданным и заканчивается ошибкой, если знаменатель равен нулю. Этого можно избежать, обработав исключение с помощью блока try-catch. Давайте обновим программу обработки исключений. Здесь мы напишем код, подверженный исключениям, внутри блока try (охраняемый блок), а блок catch будет следовать за блоком try.
Код Java: перейдите в редактор
import java.util.Scanner; открытый класс DivideExceptionHandle {public static void main (String [] args) {Scanner inputDevice = new Scanner (System.in); System.out.print ("Пожалуйста, введите сначала number (числитель): "); int numerator = inputDevice.nextInt (); System.out.print (" Пожалуйста, введите второе число (знаменатель): "); int denominator = inputDevice.nextInt (); new DivideExceptionHandle (). doDivide (числитель, знаменатель);} public void doDivide (int a, int b) {try {float result = a/b; System.out.println ("Результат деления" + a + "/" + b + "=" + result);} catch (ArithmeticException e) {System.out.println ("Программа условия исключения завершается");}}}
Вывод:
Вывод на основе комбинации пользовательского ввода:
- Когда метод Java создает исключение, в indi Обратите внимание, что как часть сигнатуры метода должно использоваться ключевое слово «throws», за которым следует исключение. Это означает, что вызывающий этот метод должен обработать исключение, указанное в предложении throws. Может быть объявлено несколько исключений, которые будут выброшены методом. Если вызывающий этот метод не обрабатывает исключение, оно распространяется на один уровень выше в стеке вызовов метода на предыдущий вызывающий объект и аналогично до тех пор, пока не достигнет базы стека вызовов метода, который будет системой времени выполнения java. Для этого подхода мы используем ключевое слово throws в объявлении метода, которое инструктирует компилятор обрабатывать исключение с помощью блока try-catch. Когда мы добавляем ключевое слово throws в объявление метода разделения, ошибка времени компиляции будет видна, как показано ниже,
Код Java: перейти в редактор
import java.util.Scanner; открытый класс DivideExceptionThrows {public static void main (String [] args) {Scanner inputDevice = new Scanner (System.in); System.out.print ("Пожалуйста, введите первое число (числитель): "); int numerator = inputDevice.nextInt (); System.out.print (" Пожалуйста, введите второе число (знаменатель): "); int denominator = inputDevice.nextInt (); попробуйте {new DivideExceptionThrows (). doDivide (числитель, знаменатель);} catch (Exception e) {System.out.println ("Программа условия исключения завершается");}} public void doDivide (int a, int b) выдает исключение {float result = a/b; System.out .println ("Результат деления" + a + "/" + b + "=" + result);}}
Как видите, в любом случае мы можем окружить код блок try-catch, или мы можем повторно выбросить его для обработки, вызвав метод. В этом случае мы вызываем метод из метода main (), поэтому, если мы повторно выбросим исключение, оно будет обработано JVM. Давайте обновим код и посмотрим, что выводится на основе комбинации ввода
Вывод:
Выводы на основе комбинации ввода пользователя:
Вложенный блок Try-catch:
Оператор try может быть вложенным. То есть оператор try может находиться внутри блока другой попытки. Каждый раз, когда вводится инструкция try, контекст этого исключения помещается в стек. Если внутренний оператор try не имеет обработчика catch для определенного исключения, стек разворачивается и Обработчики catch следующего оператора try проверяются на совпадение. Это продолжается до тех пор, пока один из операторов catch не завершится успешно или пока не будут исчерпаны все вложенные операторы try. Если ни один оператор catch не соответствует, то система времени выполнения Java обработает исключение. синтаксис вложенного блока try-catch.
Код Java: перейти в редактор
открытый класс NestedTryblockDemo {public static void main (String [ ] args) {try {//некоторый код, который может генерировать исключительную ситуацию {//некоторый код, который может генерировать исключение Arithmatic exceptiontry {//некоторый код, который может генерировать исключение формата числа} catch (NumberFormatException n) {//Number f ormat Обработка исключений}} catch (ArithmeticException a) {//Обработка ArithmeticException}} catch (Exception e) {//Обработка общего исключения (суперкласс всех исключений)}}}
Использование блока finally:
Если у вас есть действия, которые вы должны выполнить в конце последовательности try … catch, вы можете использовать блок finally. Код в блоке finally выполняется независимо от того, идентифицирует ли предыдущий блок попытки исключение. Обычно вы используете блок finally для выполнения задач очистки, которые должны выполняться независимо от того, возникли какие-либо Исключения и были ли обнаружены какие-либо возникшие Исключения. В приложении, в котором используются файлы и соединение с базой данных, нам нужно закрыть эти ресурсы как в исключительных, так и в нормальных условиях.
Код Java: перейти в редактор
public class TryCatchFinally {public void Demo () {try {//операторы для попытки} catch (Exception e) {//действия, которые происходят, если было сгенерировано исключение} finally {//действия, которые происходят выполняется ли блок catch или нет}}}
Резюме:
Мы узнали, как генерируются исключения и различные способы обработки исключений. Перехват исключения или распространение исключений. Мы изучили такие ключевые слова, как try, catch, finally, throws и программное использование этих ключевых слов.
Редактор кода Java: