Скачать презентацию Исключительные ситуации Лекция 4 1 УНЦ Инфотех Воронеж Скачать презентацию Исключительные ситуации Лекция 4 1 УНЦ Инфотех Воронеж

Тема4_1_Исключительные ситуации.ppt

  • Количество слайдов: 38

Исключительные ситуации Лекция 4. 1 УНЦ «Инфотех» Воронеж 2012 Исключительные ситуации Лекция 4. 1 УНЦ «Инфотех» Воронеж 2012

План лекции Возникновение ошибок и подходы к их обработке n Исключения и их классификация План лекции Возникновение ошибок и подходы к их обработке n Исключения и их классификация n Объявляемые исключения n Отлов исключений n Выбрасывание исключений n Создание типов исключений n Подходы к отладке приложений n 1

Возникающие проблемы n В процессе выполнения программные приложения встречаются с ситуациями, приводящими к возникновению Возникающие проблемы n В процессе выполнения программные приложения встречаются с ситуациями, приводящими к возникновению ошибок l l n Ошибки бывают различной степени тяжести Ошибки необходимо каким-либо способом учитывать и обрабатывать Ошибки возникают в случае: l l некорректного ввода данных сбоев оборудования нарушения ограничений среды выполнения программного кода 2

Исключение — это аварийное состояние, которое возникает в кодовой последовательности во время выполнения. n Исключение — это аварийное состояние, которое возникает в кодовой последовательности во время выполнения. n В машинных языках, не поддерживающих обработку исключений, ошибки должны быть проверены и обработаны вручную — обычно с помощью кодов ошибки или свободных членов возвращаемого типа n 3

Подходы к обработке ошибок n Возвращение методом кода ошибки l Встроенный в язык механизм Подходы к обработке ошибок n Возвращение методом кода ошибки l Встроенный в язык механизм проверки и обработки Возвращается только код ошибки int err. Num = first. Method(); if (err. Num == -1) { // обработка 1 -ой ошибки } else if(err. Num == -2) { // обработка 2 -ой ошибки } l n Используются «свободные» значения возвращаемого типа if ((ans = sqrt(val)) < 0) { // Обработка ошибки } else { // Продолжение вычислений } try { some. Business. Logic(); . . . another. Business. Logic() } catch(Exception 1 e 1) { // обработка 1 -ой ошибки }. . . catch(Exception. N e. N) { // обработка N-ой ошибки } finally { // выполнение завершающих // работу действий } 4

Механизм обработки n Создается и «выбрасывается» объект исключения, содержащий информацию об ошибке n Выполнение Механизм обработки n Создается и «выбрасывается» объект исключения, содержащий информацию об ошибке n Выполнение текущего потока вычислений приостанавливается n Завершается выполнение блоков и методов в цепочке вызовов вплоть до кода, отлавливающего исключение n Поток вычислений возобновляется, причем выполняется код обработчика исключения 5

Поиск обработчика исключения obj 1. method 1() Class 1. static. Method() obj 2. method Поиск обработчика исключения obj 1. method 1() Class 1. static. Method() obj 2. method 145() obj 67. method 35() найден Class 1. static. Method() поиск обработчика не найден main(String[] args) поиск обработчика Стэк вызова методов JVM obj 48. method 565() Exception 6

Классификация исключений Объявляемые n Носят предсказуемый характер Необъявляемые n Обусловлены логикой кода n Указываются Классификация исключений Объявляемые n Носят предсказуемый характер Необъявляемые n Обусловлены логикой кода n Указываются в объявлении метода n Не указываются в объявлении метода n Наследуют от класса Exception n Наследуют от классов Runtime. Exception, Error 7

Классификация исключений n n n Различают синхронные и асинхронные исключительные ситуации. Синхронная исключительная ситуация Классификация исключений n n n Различают синхронные и асинхронные исключительные ситуации. Синхронная исключительная ситуация возникает непосредственно в ходе выполнения программы, причём её причина заключается непосредственно в действиях, выполняемых самой программой. Асинхронные исключительные ситуации непосредственно не связаны с выполнением программы. Их причинами могут служить аппаратно возбуждаемые прерывания (например, сигналы от таймера), сообщения, поступающие от внешних устройств или даже от локальной сети. 8

Классификация исключений Синхронные n Непосредственный итог выполнения определенной инструкции n Могут быть объявляемыми и Классификация исключений Синхронные n Непосредственный итог выполнения определенной инструкции n Могут быть объявляемыми и необъявляемыми Асинхронные n Не зависят от выполняемой инструкции n Внутренние ошибки JVM n Результат работы deprecated методов (устаревших, не рекомендуемых для использования ) 9

Базовые классы исключений Throwable Error . . . Exception Runtime. Exception . . . Базовые классы исключений Throwable Error . . . Exception Runtime. Exception . . . 10

Объявление исключений n n ветвь возглавляемая классом Exception используется для исключительных состояний, которые должны Объявление исключений n n ветвь возглавляемая классом Exception используется для исключительных состояний, которые должны перехватывать программы пользователя. ветвь возглавляемая классом Error, определяет исключения, перехват которых программой при нормальных обстоятельствах не ожидается. 11

Объявление исключений n n Если метод способен к порождению исключения, которое он не обрабатывает, Объявление исключений n n Если метод способен к порождению исключения, которое он не обрабатывает, он должен определить свое поведение так, чтобы вызывающие методы могли сами предохранять себя от данного исключения. Реализуется включением предложения throws в заголовок объявления метода. Конструкция throws в заголовке объявления метода. использует перечисляемые типы исключений, которые метод может выбрасывать. Реализуется для всех исключений, кроме исключений типа Error, Runtime. Exception или любых их подклассов. 12

Объявление исключений class Our. Class { public int some. Method() throws Some. Exception 1, Объявление исключений class Our. Class { public int some. Method() throws Some. Exception 1, Some. Exception 2 { /* Код который может породить Some. Exception 1 или Some. Exception 2 */ } } 13

Особенности объявления исключений n Статические блоки инициализации и инициализирующие выражения не могут выбрасывать исключения Особенности объявления исключений n Статические блоки инициализации и инициализирующие выражения не могут выбрасывать исключения n Нестатические блоки инициализации могут генерировать объявляемые исключения, только если их тип указан во всех throws всех конструкторов класса 14

Вызов метода со списком исключений Варианты действий n Отловить исключения и обработать их n Вызов метода со списком исключений Варианты действий n Отловить исключения и обработать их n Отловить исключения и вместо них сгенерировать исключения типов, указанных в собственном предложении throws 15

Отлов исключений n Преимущества обработки исключений: позволяет фиксировать ошибку l предохраняет программу от автоматического Отлов исключений n Преимущества обработки исключений: позволяет фиксировать ошибку l предохраняет программу от автоматического завершения l n Конструкция try/catch/finally try { Инструкции } catch (Тип. Исключения 1 идентификатор1) { Инструкции } catch (Тип. Исключения 2 идентификатор2) { Инструкции. . . } finally { Инструкции } 16

Блок try n n Заключает в себе блок контролируемого кода, выполняемого успешно при нормальных Блок try n n Заключает в себе блок контролируемого кода, выполняемого успешно при нормальных обстоятельствах Тело выполняется вплоть до: l l Момента возникновения исключительной ситуации Благополучного достижения конца блока n Конкретный блок в процессе выполнения может выбросить только одно исключение n требует по крайней мере одного предложения catch или finally 17

Блок catch n Указывается сразу после блока try n Определяет тип перехватываемого исключения и Блок catch n Указывается сразу после блока try n Определяет тип перехватываемого исключения и его обработчик 18

Пример class Ехс2 { public static void main(String aros[j) { int d, a; try Пример class Ехс2 { public static void main(String aros[j) { int d, a; try { // контролировать блок кода d = 0; a = 42 / d; System. out. printlr. ("Это не будет напечатано. "); } catch (Arithmetic. Exception e) ( // перехватить ошибку // деления на нуль System. out. println("Деление на нуль. "); } System. out. println("После оператора catch. "); } } обрабатывает исключение типа Arithmetic. Exception, генерируемое ошибкой "деление на нуль" 19

Блок catch n Количество блоков catch не регламентировано n Предложения catch рассматриваются последовательно до Блок catch n Количество блоков catch не регламентировано n Предложения catch рассматриваются последовательно до обнаружения среди них того, тип которого допускает присвоение выброшенного исключения n Список предложений catch просматривается только один раз! 20

Пример n Демонстрация множественных catch-операторов Без входных параметров выбрасывается исключение class Multi. Catch { Пример n Демонстрация множественных catch-операторов Без входных параметров выбрасывается исключение class Multi. Catch { Arithmetic. Exception – public static void main(String argsf]) { деление на ноль try { int a = args. length; С входными параметрами System. out. println("a = " + a); Array. Index. Out. Of. Bounds. Exception т. к. целочисленный int b = 42 / a; массив имеет дину 1 int c[] = { 1 }; с[42] = 99; } catch(Arithmetic. Exception e) ( System. out. println("Деление на нуль: " + e); } catch(Array. Index. Out. Of. Bounds. Exception e) { System. out. println("Индекс элемента массива oob: " + e); } System. out. println("После блока try/catch"); } } 21

Вложенные операторы try n Операторы try могут быть вложенными // Пример вложенных try-операторов, class Вложенные операторы try n Операторы try могут быть вложенными // Пример вложенных try-операторов, class Nest. Try { public static void main(String args[]) { try { int a = args. length; /* Если нет аргументов командной строки, следующий оператор будет генерировать исключение деления на нуль. */ int b = 42 / а; System. out. println("а = " + а); try { // вложенный try-блок /* Если используется один аргумент командной строки, то следующий код будет генерировать исключение деления на нуль. */ if(a==l) а = а/(а-а); // деление на нуль /* Если используется два аргумента командной строки, то генерируется исключение выхода за границу массива. */ if(а==2) { int с[] = { 1 }; с[42]=99; // генерировать исключение } // выхода за границу массива } catch(Arraylndex. Out. Of. Bounds. Exception е) { System. out. println("Индекс выходит за границу массива: " + е); } } catch(Arithmetic. Exception е) { System. out. println("Деление на нуль: " + е); } } } 22

Блок finally n Блок finally необязателен n Если присутствует, то выполняется после завершения работы Блок finally n Блок finally необязателен n Если присутствует, то выполняется после завершения работы остальных фрагментов кода try/catch выполняется всегда, когда метод собирается вернуться к вызывающей программе изнутри блока try/catch выполнение происходит непосредственно перед возвратом из метода. Обрабатывается даже если нет catch операторов соответствующего исключения Блок finally выполняется в любом случае: n n n l l l Успешное выполнение С выбрасыванием исключения С передачей управления при переходе по break или return 23

Блок finally § Демонстрирует finally class Finally. Demo { // Выход из метода через Блок finally § Демонстрирует finally class Finally. Demo { // Выход из метода через исключение static void proc. A() { try { System. out. println("Внутри proc. A"); throw new Runtime. Exception("demo"); } finally { System. out. println("finally для proc. A ") ; } } // Возврат изнутри try-блока static void proc. B() { try { System. out. println("Внутри proc. B"); return; } finally { System. out. println("finally для proc. B "); } } 24

Блок finally // Нормальное выполнение try-блока, static void proc. C() { try { System. Блок finally // Нормальное выполнение try-блока, static void proc. C() { try { System. out. println("Внутри proc. C"); } finally { System. out. println("finally proc. C"); } } public static void main(String args[]) { try ( proc. A(); } catch (Exception e) { System. out. println("Исключение выброшено"); } proc. B(); proc. C(); } } Внутри ргос. А finally для ргос. А Исключение выброшено Внутри ргос. В finally для ргос. В Внутри ргос. С finally для ргос. С 25

Выбрасывание исключений n n n Явно (принудительно) выбрасываемые исключения Простые типы, такие как int Выбрасывание исключений n n n Явно (принудительно) выбрасываемые исключения Простые типы, такие как int или char, а также не. Throwable-классы (типа string и object) не могут использоваться как исключения Имеется два способа получения Throwableобъекта: использование параметра в предложении catch с указанием типа исключения l создание объекта с помощью операции new l 26

Пример § Демонстрирует throw class Throw. Demo { static void demoproc() { try { Пример § Демонстрирует throw class Throw. Demo { static void demoproc() { try { throw new Null. Pointer. Exception("demo"); } catch(Null. Pointer. Exception e) { System. out. println("Захват внутри demoproc. "); throw e; // повторный выброс исключения } } public static void main(String args[]) { try { demoproc (); } catch(Null. Pointer. Exception e) { System. out. println("Повторный захват: " + e); } } } Захват внутри demoproc. Повторный захват: Java. lang. Null. Pointer. Exception: demo 27

Пример public void replace. Value(String name, Object new. Value) throws No. Such. Attribute. Exception Пример public void replace. Value(String name, Object new. Value) throws No. Such. Attribute. Exception { Attr attr = find(name); // Искать attr if (attr == null) // Если атрибут не найден throw new No. Such. Attribute. Exception(name, this); attr. value. Of(new. Value); } n n Метод replace. Value сначала ищет имя атрибута в текущем объекте Attr. Если атрибут не найден, то возбуждается объект-исключение типа No. Such Attribite. Exception. Исключения являются объектами, поэтому перед использованием их необходимо создать. Если атрибут не существует, то его значение заменяется новым. 28

Создание типов исключений n Создается новый тип, наследующий от более широкого типа, подходящего по Создание типов исключений n Создается новый тип, наследующий от более широкого типа, подходящего по смыслу (например, java. lang. Index. Out. Of. Bounds. Exception) n Чаще всего класс содержит только 2 конструктора (по умолчанию и с параметром-строкой), просто вызывающие конструкторы родительского класса 29

Пример §Эта программа создает заказной тип исключения class My. Exception extends Exception { private Пример §Эта программа создает заказной тип исключения class My. Exception extends Exception { private int detail; My. Exception(int a) { detail = a; } public String to. String() { return "My. Exception[" + detail + "]"; } } class Exception. Demo { static void compute(int a) throws My. Exception { System. out. println("Вызван compute(" + a + ")); if (a > 10) throw new My. Exception(a); System. out. println("Нормальный выход"); } public static void main(String args[]) { try { compute(1); compute(20); } catch (My. Exception e) { System. out. println("Выброшено " + e); } } } Вызван compute(1) Нормальный выход Вызван compute(20) Выброшено My. Exception[20] 30

Исключение Array. Index. Out. Of. Bounds. Exception n Это исключение возникает, когда программа пытается Исключение Array. Index. Out. Of. Bounds. Exception n Это исключение возникает, когда программа пытается адресовать элементы за пределами массива int i = 0; int[] n. Array = new int[5]; while(true){ try { n. Array[i] = i; } catch(Exception ex) { System. out. println("n" + ex. to. String()); break; } System. out. print(i); i++; } 01234 java. lang. Array. Index. Out. Of. Bounds. Exception: 5 31

Исключение Arithmetic. Exception n Возникает при попытке деления на нуль i = 0; try Исключение Arithmetic. Exception n Возникает при попытке деления на нуль i = 0; try { i = 5/i; } catch(Exception ex) { System. out. println(ex. to. String()); } java. lang. Arithmetic. Exception: / by zero 32

Исключение Array. Store. Exception n Возникнет, если попытаться записать в ячейку массива ссылку на Исключение Array. Store. Exception n Возникнет, если попытаться записать в ячейку массива ссылку на объект неправильного типа Object sz. Str[] = new String[10]; try { sz. Str[0] = new Character('*'); } catch(Exception ex) { System. out. println(ex. to. String()); } java. lang. Array. Store. Exception 33

Исключение Class. Cast. Exception n Возникает если, выполнять явное преобразование типов произвольным образом. Например, Исключение Class. Cast. Exception n Возникает если, выполнять явное преобразование типов произвольным образом. Например, преобразование для классов, не связанных наследованием, или другим недопустимым способом Object ch = new Character('*'); try { System. out. println((Byte)ch); } catch(Exception ex) { System. out. println(ex. to. String()); } java. lang. Class. Cast. Exception: java. lang. Character 34

Исключение Negative. Array. Size. Exception n Возникает при попытке создать массив отрицательного размера try Исключение Negative. Array. Size. Exception n Возникает при попытке создать массив отрицательного размера try { int[] n. Neg. Array = new int[-5]; } catch(Exception ex) { System. out. println(ex. to. String()); } java. lang. Negative. Array. Size. Exception 35

Исключение Null. Pointer. Exception n Если попытаться использовать в программе ссылку, содержащую значение null Исключение Null. Pointer. Exception n Если попытаться использовать в программе ссылку, содержащую значение null int[] n. Nul. Array = new int[5]; n. Nul. Array = null; try { i = n. Nul. Array. length; } catch(Exception ex) { System. out. println(ex. to. String()); } java. lang. Null. Pointer. Exception 36

Исключение String. Index. Out. Of. Bounds. Exception n Если указать позицию, лежащую за границей Исключение String. Index. Out. Of. Bounds. Exception n Если указать позицию, лежащую за границей строки String sz. Short. String = "123"; try { char chr = sz. Short. String. char. At(10); } catch(Exception ex) { System. out. println(ex. to. String()); } java. lang. String. Index. Out. Of. Bounds. Exception: String index out of range: 10 37