Язык программирования Java. Схема возникновения и обработки исключений. Возникновение исключения

Страницы работы

Фрагмент текста работы

Язык программирования Java

Часть 6. Исключения

  • Введение
  • Исключения и ошибки
  • Проверяемые и непроверяемые исключения
  • Блок try-catch-finally
  • Оператор throw
  • Зарезервированное слово throws
  • Некоторые типы исключений

Исключение

  • Исключение в Java — это объект, который описывает исключительное состояние, возникшее в каком-либо участке программного кода.
  • Когда возникает исключительное состояние, создается объект класса Exception. Этот объект пересылается в метод, обрабатывающий данный тип исключительной ситуации.
  • По «следам» стека
  • программы можно найти
  • данный метод – и причину
  • ошибки

Схема возникновения и обработки исключений

Бросает исключение

Метод, в котором возникла ошибка

Метод, в котором возникла ошибка

Вызов метода

Ищет подходящий обработчик

Перебрасывает дальше

Метод, не обрабаты- вающий исключение

Метод, не обрабаты- вающий исключение

Ищет подходящий обработчик

Вызов метода

Обрабатывает исключение

Метод, обрабаты- вающий исключение

Метод, обрабаты- вающий исключение

Вызов метода

main

main

Что поможет найти исключение

  • «Говорящие» имена исключений и краткое описание в стеке
  • Номера строк кода, по которым «пробежало» исключение
  • Средства отладки среды
  • - debug (отладка, «ловля клопов»)
  • - breakpoints (точки останова)

Возникновение исключения

Совершаем преднамеренную ошибку – делим на ноль.

class SimpleMistake { public static void main(String args[]) { int d = 0; int a = 42 / d; } }

Обработка исключения

Ловим свою ошибку и выводим информацию на консоль.

class SimpleMistake{ public static void main(String args[]){ try{ int d = 0; //выполнится int a = 42 / d; int z = a + d; //не выполнится } catch (ArithmeticException e) { System.out.println(«Деление на ноль"); } } }

Как действует связка try-catch

try{ doSomethingDangerous(); //опасный метод } catch (CatchedExceptionType e) { treatDanger(); //обработка исключения } //CatchedExceptionType – класс, к которому принадлежит исключение e

try {

} catch (...) {

}

Иерархия бросаемых объектов

Виды исключений

  • Проверяемое (FileNotFoundException, IOException, …). После такой ситуации зачастую требуется восстановление состояния программы. Обязательны для описания при определении метода.
  • Ошибка (класс Error и его наследники).
  • Исключение времени исполнения (RuntimeException и все наследники). Восстановление после таких ситуаций обычно не производится.

Примеры исключений

  • ArithmeticException - ошибка при вычислениях – например, деление на 0.
  • ArrayIndexOutOfBoundsException - выход за пределы массива.
  • FileNotFoundException если не обнаружен запрошенный файл.
  • IOException - любое исключение в системе ввода/вывода; включает предыдущее.

Требования к коду

  • Если метод вызывает проверяемое исключение, то он должен :
    • либо обработать его
    • либо передать исключение выше по стеку вызова
  • Неудовлетворяющий
  • этому правилу код
  • не компилируется.

Каскад обработчиков

Иногда одного обработчика недостаточно – создаем несколько, на разные типы исключений.

class MultiCatch { public static void main (String args[]) { try { riskyMethod(); } catch (ArithmeticException e) { tryToHandleArithmetic(); } catch(ArrayIndexOutOfBoundsException e) { tryToHandleIndex(); } } }

Вложенные блоки

Также можно вкладывать один блок try-catch в другой (число вложений ограничено реализацией JVM).

class LevelNest{ public static void main(String args[]) { try { //может бросить арифм. исключение doSomePreparation(); //тоже может бросить, но наружу //оно не передано не будет - см. следующий слайд. doCalculation (); } сatch (ArithmeticException e) { tryToHandle(); } } }

Вложенные блоки (продолжение)

Этот метод сам обрабатывает свое же исключение, поэтому наружу исключение не выбрасывается.

public static void doCalculation(){ try { riskyCode(); } catch(ArrayIndexOutOfBoundsException e) { tryToHandle(); } }

Явно брошенное исключение

Хотим при определенных условиях выбросить исключение вверх (оператор throw ).

class ThrowDemo { void riskyMethod() { try { //какие-то действия if (condition){ //бросаем исключение throw new NullPointerException ("reason"); } }catch (NullPointerException e) { prepareToClose(); //передача исключения выше throw e; } }

Описание исключений

Предупреждаем, что наш метод не обрабатывает исключение, а бросает его выше (ключевое слово throws ).

class ThrowsDemo { static void riskyMethod() throws IllegalAccessException { //do something if (condition){ throw new IllegalAccessException("fake"); } } public static void main(String args[]){ riskyMethod(); } }

Блок finally

Превратив блок try-catch в блок try-catch-finally, добиваемся того, что некий набор действий выполнится независимо от того, поймали мы исключение или нет.

try { //какие-то действия doSomething(); //иногда бросает исключение doSomethingRisky(); }catch (NullPointerException e) { handleState(); //обрабатываем исключение } finally { //действия, которые нужно выполнить независимо // от того, были ли брошено исключение или нет doFinalStuff(); }

Пользовательские классы-исключения

Создаем свой класс исключений на основе класса Exception.

class TooHeavyBirdException extends Exception { private int weight; private String message; TooHeavyBirdException (int weight, String message) { this. weight = weight; this. message = message; } }

Пользовательские классы-исключения (продолжение)

try {//какие-то действия if (condition){ //бросаем наше исключение throw new TooHeavyBirdException (10, “Веревка не выдержала птицу"); } //другие действия }catch (TooHeavyBirdException e) { showModalDialog(e.getMessage()); }

Вредные советы

  • Закрыть все опасные участки пустыми обработчиками (catch(...){ }).
  • Быстро и эффективно.
  • Только потом очень долго придется искать, почему программа ведет себя не так, как ей полагается…
  • Использовать везде catch(Exception e){...} и throws Exception.
  • Действительно, зачем размениваться на частности и возиться с каскадами

Похожие материалы

Информация о работе