Обработка исключений требуется на любом языке программирования для обработки ошибок времени выполнения, чтобы можно было поддерживать нормальный поток приложения.
Исключение обычно нарушает нормальный поток приложения, поэтому мы должны использовать обработку исключений в нашем приложении.
Исключения широко подразделяются на следующие категории —
-
Проверенное исключение — классы, которые расширяют класс Throwable, за исключением RuntimeException и Error, известны как проверенные исключения, например ,IOException, SQLException и т. Д. Проверенные исключения проверяются во время компиляции.
Проверенное исключение — классы, которые расширяют класс Throwable, за исключением RuntimeException и Error, известны как проверенные исключения, например ,IOException, SQLException и т. Д. Проверенные исключения проверяются во время компиляции.
Одним классическим случаем является FileNotFoundException. Предположим, у вас есть следующий код в вашем приложении, который читает из файла на E-диске.
class Example { static void main(String[] args) { File file = new File("E://file.txt"); FileReader fr = new FileReader(file); } }
если файл (file.txt) отсутствует на диске E, возникает следующее исключение.
Caught: java.io.FileNotFoundException: E: \ file.txt (система не может найти указанный файл).
java.io.FileNotFoundException: E: \ file.txt (система не может найти указанный файл).
-
Непроверенное исключение — классы, которые расширяют RuntimeException, называются непроверенными исключениями, например, ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException и т. Д. Непроверенные исключения не проверяются во время компиляции, а проверяются во время выполнения.
Непроверенное исключение — классы, которые расширяют RuntimeException, называются непроверенными исключениями, например, ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException и т. Д. Непроверенные исключения не проверяются во время компиляции, а проверяются во время выполнения.
Одним классическим случаем является исключение ArrayIndexOutOfBoundsException, которое возникает, когда вы пытаетесь получить доступ к индексу массива, который больше длины массива. Ниже приведен типичный пример ошибки такого рода.
class Example { static void main(String[] args) { def arr = new int[3]; arr[5] = 5; } }
Когда приведенный выше код будет выполнен, будет сгенерировано следующее исключение.
Пойман: java.lang.ArrayIndexOutOfBoundsException: 5
java.lang.ArrayIndexOutOfBoundsException: 5
-
Ошибка — ошибка необратима, например, OutOfMemoryError, VirtualMachineError, AssertionError и т. Д.
Ошибка — ошибка необратима, например, OutOfMemoryError, VirtualMachineError, AssertionError и т. Д.
Это ошибки, которые программа никогда не сможет исправить, и это приведет к ее аварийному завершению.
Следующая диаграмма показывает, как организована иерархия исключений в Groovy. Все это основано на иерархии, определенной в Java.
Ловить исключения
Метод перехватывает исключение, используя комбинацию ключевых слов try и catch . Вокруг кода помещается блок try / catch, который может генерировать исключение.
try { //Protected code } catch(ExceptionName e1) { //Catch block }
Весь ваш код, который может вызвать исключение, помещается в блок защищенного кода.
В блоке catch вы можете написать собственный код для обработки вашего исключения, чтобы приложение могло восстановиться после исключения.
Давайте рассмотрим пример аналогичного кода, который мы видели выше для доступа к массиву со значением индекса, превышающим размер массива. Но на этот раз давайте обернем наш код в блок try / catch.
class Example { static void main(String[] args) { try { def arr = new int[3]; arr[5] = 5; } catch(Exception ex) { println("Catching the exception"); } println("Let's move on after the exception"); } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —
Catching the exception Let's move on after the exception
Из приведенного выше кода мы оборачиваем неисправный код в блоке try. В блоке catch мы просто перехватываем наше исключение и выводим сообщение о том, что произошло исключение.
Многократные Пойманные Блоки
Можно иметь несколько блоков catch для обработки нескольких типов исключений. Для каждого блока catch, в зависимости от типа возникшего исключения, вы должны написать код для соответствующей обработки.
Давайте изменим приведенный выше код, чтобы он специально перехватывал исключение ArrayIndexOutOfBoundsException. Ниже приведен фрагмент кода.
class Example { static void main(String[] args) { try { def arr = new int[3]; arr[5] = 5; }catch(ArrayIndexOutOfBoundsException ex) { println("Catching the Array out of Bounds exception"); }catch(Exception ex) { println("Catching the exception"); } println("Let's move on after the exception"); } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —
Catching the Aray out of Bounds exception Let's move on after the exception
Из приведенного выше кода вы можете видеть, что блок перехвата ArrayIndexOutOfBoundsException перехватывается первым, потому что это означает критерии исключения.
Наконец-то блок
Блок finally следует за блоком try или блоком catch. Блок кода finally всегда выполняется независимо от возникновения исключения.
Использование блока finally позволяет запускать любые операторы типа очистки, которые вы хотите выполнить, независимо от того, что происходит в защищенном коде. Синтаксис этого блока приведен ниже.
try { //Protected code } catch(ExceptionType1 e1) { //Catch block } catch(ExceptionType2 e2) { //Catch block } catch(ExceptionType3 e3) { //Catch block } finally { //The finally block always executes. }
Давайте изменим наш код выше и добавим блок finally. Ниже приведен фрагмент кода.
class Example { static void main(String[] args) { try { def arr = new int[3]; arr[5] = 5; } catch(ArrayIndexOutOfBoundsException ex) { println("Catching the Array out of Bounds exception"); }catch(Exception ex) { println("Catching the exception"); } finally { println("The final block"); } println("Let's move on after the exception"); } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —
Catching the Array out of Bounds exception The final block Let's move on after the exception
Ниже приведены методы исключения, доступные в Groovy.
public String getMessage ()
Возвращает подробное сообщение об исключении, которое произошло. Это сообщение инициализируется в конструкторе Throwable.
public Throwable getCause ()
Возвращает причину исключения в виде объекта Throwable.
public String toString ()
Возвращает имя класса, объединенного с результатом getMessage ()
public void printStackTrace ()
Печатает результат toString () вместе с трассировкой стека в System.err, поток вывода ошибок.
public StackTraceElement [] getStackTrace ()
Возвращает массив, содержащий каждый элемент в трассировке стека. Элемент с индексом 0 представляет вершину стека вызовов, а последний элемент в массиве представляет метод в нижней части стека вызовов.
public Throwable fillInStackTrace ()
Заполняет трассировку стека этого объекта Throwable текущей трассировкой стека, добавляя к любой предыдущей информации в трассировке стека.
пример
Ниже приведен пример кода с использованием некоторых методов, приведенных выше:
class Example { static void main(String[] args) { try { def arr = new int[3]; arr[5] = 5; }catch(ArrayIndexOutOfBoundsException ex) { println(ex.toString()); println(ex.getMessage()); println(ex.getStackTrace()); } catch(Exception ex) { println("Catching the exception"); }finally { println("The final block"); } println("Let's move on after the exception"); } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —