Язык программирования Java
Часть 6. Исключения
Исключение
Схема возникновения и обработки исключений
Бросает исключение
Метод, в котором возникла ошибка
Метод, в котором возникла ошибка
Вызов метода
Ищет подходящий обработчик
Перебрасывает дальше
Метод, не обрабаты- вающий исключение
Метод, не обрабаты- вающий исключение
Ищет подходящий обработчик
Вызов метода
Обрабатывает исключение
Метод, обрабаты- вающий исключение
Метод, обрабаты- вающий исключение
Вызов метода
main
main
Что поможет найти исключение
Возникновение исключения
Совершаем преднамеренную ошибку – делим на ноль.
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 (...) {
}
Иерархия бросаемых объектов
Виды исключений
Примеры исключений
Требования к коду
Каскад обработчиков
Иногда одного обработчика недостаточно – создаем несколько, на разные типы исключений.
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()); }
Вредные советы
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.