Исключения в языке программирования Java
Вступление
Исключение Java - это объект, который описывает исключительное (то есть, ошибка) условие, которое произошло в части кода. Когда возникает исключительное условие, объект, представляющий это исключение, создается и добавляется в метод, вызвавший ошибку. Этот метод может выбрать обработку самого исключения или передать его дальше. В любом случае, в какой-то момент, исключение перехватывается и обрабатывается.
Программы, которые вы пишете, могут генерировать много типов потенциальных исключений, например, когда вы делаете следующее:
В Java есть три типа циклов:
- Вы вводите команду для чтения файла с диска, но файл там не существует.
- Вы пытаетесь записать данные на диск, но диск заполнен или не отформатирован.
- Ваша программа запрашивает ввод пользователя, но пользователь вводит неверные данные.
- Программа пытается разделить значение на 0, получить доступ к массиву с слишком большим нижним индексом или вычислить значение, которое слишком велико для типа переменной ответа.
Эти ошибки называются исключениями, потому что, предположительно, они не являются обычными случаями; они являются «исключительными». Объектно-ориентированные методы для управления такими ошибками составляют группу методов, известных как обработка исключений.
Обработка исключений работает путем передачи выполнения программы соответствующему обработчику исключений при возникновении исключения. Давайте рассмотрим пример программы, которая будет принимать два числа от пользователя и выводить результат деления на экран. Это может привести к исключительной ситуации, если знаменатель равен нулю.
Java-код: перейти к редактору
import java.util.Scanner;
public class DivideExceptionDemo {
public static void main(String[] args) {
//Scanner class is wrapper class of System.in object
Scanner inputDevice = new Scanner(System.in);
System.out.print("Please enter first number(numerator): ");
int numerator = inputDevice.nextInt();
System.out.print("Please enter second number(denominator): ");
int denominator = inputDevice.nextInt();
new DivideExceptionDemo().doDivide(numerator, denominator);
}
public void doDivide(int a, int b){
float result = a/b;
System.out.println("Division result of "+ a +"/"+b +"=" +result);
}
}
Выход:
Выходы на основе пользовательских комбинаций ввода:
Обработка исключений:
Существует два способа обработки исключения: сначала перехватить исключение и предпринять корректирующее действие, либо вызвать исключение в вызывающий метод, который заставит вызывающий метод его обработать.
- В вышеуказанной программе выполнение является неожиданным и завершается ошибкой в случае, если знаменатель равен нулю. Мы можем избежать этого, обрабатывая исключение, используя блок try-catch. Давайте обновим программу для обработки исключений. Здесь мы напишем склонный к исключениям код внутри блока try (защищенный блок), а блок catch будет следовать за блоком try.
Java-код: перейти к редактору
import java.util.Scanner;
public class DivideExceptionHandle {
public static void main(String[] args) {
Scanner inputDevice = new Scanner(System.in);
System.out.print("Please enter first number(numerator): ");
int numerator = inputDevice.nextInt();
System.out.print("Please enter second number(denominator): ");
int denominator = inputDevice.nextInt();
new DivideExceptionHandle().doDivide(numerator, denominator);
}
public void doDivide(int a, int b){
try{
float result = a/b;
System.out.println("Division result of "+ a +"/"+b +"=" +result);
}catch(ArithmeticException e){
System.out.println("Exception Condition Program is ending ");
}
}
}
Выход:
Выходы основаны на комбинации пользовательского ввода:
- Когда метод Java собирается вызвать исключение, чтобы указать, что в качестве части сигнатуры метода следует использовать ключевое слово throws, за которым следует исключение. Это означает, что вызывающая сторона этого метода должна обработать исключение, указанное в предложении throws. Может быть несколько исключений, объявленных как метод. Если вызывающая сторона этого метода не обрабатывает исключение, то она распространяется на один уровень выше в стеке вызовов метода по сравнению с предыдущей вызывающей стороной и аналогично до тех пор, пока не достигнет базы стека вызовов метода, который будет системой времени исполнения java. Для этого подхода мы используем ключевое слово throws в объявлении метода, которое будет указывать компилятору обрабатывать исключение, используя блок try-catch. Когда мы добавим ключевое слово throws в объявление метода разделения, ошибка времени компиляции будет выглядеть так:
Java-код: перейти к редактору
import java.util.Scanner;
public class DivideExceptionThrows {
public static void main(String[] args){
Scanner inputDevice = new Scanner(System.in);
System.out.print("Please enter first number(numerator): ");
int numerator = inputDevice.nextInt();
System.out.print("Please enter second number(denominator): ");
int denominator = inputDevice.nextInt();
try {
new DivideExceptionThrows().doDivide(numerator, denominator);
} catch (Exception e) {
System.out.println("Exception Condition Program is ending ");
}
}
public void doDivide(int a, int b) throws Exception{
float result = a/b;
System.out.println("Division result of "+ a +"/"+b +"=" +result);
}
}
Как видите, либо мы можем окружить код блоком try-catch, либо мы можем перебросить его для обработки, вызвав метод. В этом случае мы вызываем метод из метода main (), поэтому, если мы повторно сгенерируем исключение, оно будет обработано JVM. Давайте обновим код и увидим вывод на основе комбинации ввода
Выход:
Выходы основаны на комбинации пользовательского ввода:
Вложенный блок Try-catch:
Оператор try может быть вложенным. То есть оператор try может находиться внутри блока другого try. Каждый раз, когда вводится оператор try, контекст этого исключения помещается в стек. Если внутренний оператор try не имеет обработчика catch для определенного исключения, стек разматывается, и обработчики следующего оператора try проверяются на совпадение. Это продолжается до тех пор, пока один из операторов catch не завершится успешно, или пока все вложенные операторы try не будут исчерпаны. Если ни один из операторов catch не совпадает, тогда среда выполнения Java будет обрабатывать исключение. Ниже приведен синтаксис вложенного блока try-catch.
Java-код: перейти к редактору
public class NestedTryblockDemo {
public static void main(String[] args) {
try{
//some code which can throw Exception
try {
//Some code which can throw Arithmatic exception
try {
//Some code which can throw number format exception
}catch(NumberFormatException n){
//Number format Exception handling
}
}catch(ArithmeticException a){
//ArithmeticException Handling
}
}catch(Exception e ){
//General Exception(SuperClass of all Exception) Handling
}
}
}
Использование блока finally:
Если у вас есть действия, которые вы должны выполнить в конце последовательности try ... catch, вы можете использовать блок finally. Код в блоке finally выполняется независимо от того, идентифицирует ли предыдущий блок try исключение. Обычно вы используете блок finally для выполнения задач очистки, которые должны происходить независимо от того, возникли ли какие-либо Исключения и были ли обнаружены какие-либо Исключения, которые произошли. В приложении, где используются соединения с базой данных, файлы, мы должны закрыть эти ресурсы как в исключительном, так и в нормальном состоянии.
Java-код: перейти к редактору
public class TryCatchFinally {
public void Demo() {
try {
// statements to try
} catch (Exception e) {
// actions that occur if exception was thrown
} finally {
// actions that occur whether catch block executed or not
}
}
}
Резюме:
Мы узнали о том, как генерируются исключения, и о различных способах обработки исключений. Поймать исключение или распространять исключения. Мы изучили такие ключевые слова, как try, catch, finally, throws и программное использование этих ключевых слов.
Редактор кода Java:
Предыдущая: Заявления о ветвлении Java
Далее: проверено и не проверено
Новый контент: Composer: менеджер зависимостей для PHP , R программирования