1 Обработка исключений Типы ошибок Ошибки компиляции Времени

  • Размер: 543 Кб
  • Количество слайдов: 28

Описание презентации 1 Обработка исключений Типы ошибок Ошибки компиляции Времени по слайдам

1 Обработка исключений Типы ошибок Ошибки компиляции Времени выполнения (run-time errors,  exceptions,  исключения )1 Обработка исключений Типы ошибок Ошибки компиляции Времени выполнения (run-time errors, exceptions, исключения ) if (flag == 1) n=0; else n=1; val=1/n; Логические ошибки

2 Обработка исключений Исключение в Java — это объект некоторого класса, который описывает исключительное состояние, возникшее2 Обработка исключений Исключение в Java — это объект некоторого класса, который описывает исключительное состояние, возникшее в каком-либо участке программного кода. При возникновении исключения исполняющая система Java создает объект класса, связанного с данным исключением. Этот объект хранит информацию о возникшей исключительной ситуации (точка возникновения, описание и т. п. ) Возможна как автоматическая так и программная генерация исключений.

3 Обработка исключений try { // блок кода } catch (Exception. Type 1 еx. Ob 1)3 Обработка исключений try { // блок кода } catch (Exception. Type 1 еx. Ob 1) { // обработчик исключений типа Exception. Type 1 } [catch (Exception. Type 2 еx. Ob 2) { // обработчик исключений типа Exception. Type 2 }] [finally { //код, который выполняется перед выходом из блока try }] Формат try-catch блока

4 Обработка исключений Формат try-catch блока try { read_from_file (data. txt); calculate(); } catch ( File.4 Обработка исключений Формат try-catch блока try { read_from_file («data. txt»); calculate(); } catch ( File. Not. Found. Exception fe ) { System. out. println(«Файл data. txt не найден»); } catch ( Arithmetic. Exception aex ) { System. out. println(«Деление на ноль»); }

5 Обработка исключений Формат try-catch блока  • управление никогда не возвращается из блока catch обратно5 Обработка исключений Формат try-catch блока • управление никогда не возвращается из блока catch обратно в блок try, после выполнения catch-блока управление передается строке, следующей сразу после try-catch-блока; • область видимости catch-блока ограничена ближайшим предшествующим утверждением try, т. е. catch-блок не может захватывать исключение, выброшенное «не своим» try-блоком; • операторы, контролируемые утверждением try, должны быть окружены фигурными скобками даже если это одиночная инструкция. • блоки try могут быть вложенными

6 Обработка исключений Стек вызовов Если обработчик не найден исключение передается JVM. 6 Обработка исключений Стек вызовов Если обработчик не найден исключение передается JVM.

7 Обработка исключений Дефолтный обработчик исключений 7 Обработка исключений Дефолтный обработчик исключений

8 Обработка исключений Классы исключений никогда не обрабатываются,  т. к. не имеет смысла обязательно обрабатывать,8 Обработка исключений Классы исключений никогда не обрабатываются, т. к. не имеет смысла обязательно обрабатывать, иначе код не скомпилируется надо обрабатывать, но компилятор это не проверяет

9 Обработка исключений Классы исключений Catch-блоки просматриваются в порядке их появления в программе, при этом обработчик9 Обработка исключений Классы исключений Catch-блоки просматриваются в порядке их появления в программе, при этом обработчик catch для суперкласса перехватывает исключения как для своего класса так и для всех его подклассов. Следовательно, в последовательности catch-блоков подклассы исключений должны следовать перед любым из суперклассов.

10 Обработка исключений Классы исключений try {input. File(data. txt);  calculate();  } catch ( IOException10 Обработка исключений Классы исключений try {input. File(«data. txt»); calculate(); } catch ( IOException Ex. Obj 2) {System. out. println(«Ошибка ввода-вывода»); } catch ( File. Not. Found. Exception Ex. Obj 1) {System. out. println(«Файл data. txt не найден»); }Error: unreachable code! т. к. File. Not. Found. Exception – подкласс IOException catch ( File. Not. Found. Exception Ex. Obj 1) {System. out. println(«Файл data. txt не найден»); } catch ( IOException Ex. Obj 2) {System. out. println(«Ошибка ввода-вывода»); }

11 Обработка исключений Оператор throw Программная генерация исключения: throw new Exception. Class. Name(); throw new Exception.11 Обработка исключений Оператор throw Программная генерация исключения: throw new (); throw new (“…”);

12 Обработка исключений Оператор throw public void demoproc () {try {throw new Null. Pointer. Exception(demo); }12 Обработка исключений Оператор throw public void demoproc () {try {throw new Null. Pointer. Exception(«demo»); } catch (Null. Pointer. Exception e) {System. out. println(«caught inside demoproc»); throw e; } } public static void main(String args[]) {try {demoproc(); } catch(Null. Pointer. Exception e) {System. out. println(«recaught: » + e); } }

13 Обработка исключений Оператор throw Вывод программы: 13 Обработка исключений Оператор throw Вывод программы:

14 Обработка исключений Оператор throws Исключения, которые порождены от Exception, но не от Runtime. Exception, могут14 Обработка исключений Оператор throws Исключения, которые порождены от Exception, но не от Runtime. Exception, могут быть сгенерированы только явно операцией throw. При этом если метод может выбрасывать одно из таких исключений, то должно выполняться одно из двух условий: либо для такого исключения должен быть catch-обработчик, либо в заголовке такого метода должна стоять конструкция: throws (т. н. Catch or Specify Requirement ) public String read. Line() throws IOException

15 Обработка исключений Оператор throws Вызов метода, в описании которого стоит  throws. . . ,15 Обработка исключений Оператор throws Вызов метода, в описании которого стоит » throws. . . «, тоже должен находиться либо внутри try-catch-блока, либо внутри метода с конструкцией » throws. . . » в его заголовке и т. д. вплоть до метода main(). Таким образом, где-то в программе любое возможное исключение, попадающее в категорию Catch or Specify Requirement обязано быть перехвачено и обработано.

16 Обработка исключений Подклассы Exception class My. Exception extends Exception {private int detail; My. Exception(int a)16 Обработка исключений Подклассы Exception class My. Exception extends Exception {private int detail; My. Exception(int a) {detail = a; } public String to. String() {return «My. Exception[» + detail + «]»; } } Если надо создать исключение необязательное к перехвату – его надо унаследовать от Runtime. Exception.

try-catch-finally 17 Оператор finally предназначен для того,  чтобы обеспечить гарантированное выполнение какого-либо фрагмента кода. try-catch-finally 17 Оператор finally предназначен для того, чтобы обеспечить гарантированное выполнение какого-либо фрагмента кода. Вне зависимости от того, возникла ли исключительная ситуация в блоке try, задан ли подходящий блок catch, не возникла ли ошибка в самом блоке catch, — все равно блок finally будет в конце концов исполнен.

try-catch-finally 18 try {  byte [] buffer = new byte[128];   File. Input. Streamtry-catch-finally 18 try { byte [] buffer = new byte[128]; File. Input. Stream fis = new File. Input. Stream(«file. txt»); while(fis. read(buffer) > 0) { . . . обработка данных. . . } } catch(IOException es) { . . . обработка исключения. . . } finally { fis. flush(); fis. close(); }

try-catch-finally 19 try {  . . . } finally {  . . . }try-catch-finally 19 try { . . . } finally { . . . }

Finally 20 public  class Test { public  static  void main (String. . .Finally 20 public class Test { public static void main (String. . . args ) { System. out. println(f()); } private static int f() { try { return 0; } finally { return 1; } } }

Finally 21 public  class Test { public  static  void main (String. . .Finally 21 public class Test { public static void main (String. . . args ) { System. out. println(f()); } private static int f() { try { System. out. println(0); return 42; } finally { System. out. println(1); throw new Runtime. Exception(); } } }

Finally 22 Finally

Finally 23 public  class Test { public  static  void main (String. . .Finally 23 public class Test { public static void main (String. . . args ){ try { System. out. println(0); throw new Null. Pointer. Exception(); } catch (Null. Pointer. Exception e ){ System. out. println(1); throw new Illegal. Argument. Exception(); } catch (Illegal. Argument. Exception e ){ System. out. println(2); } finally { System. out. println(3); } System. out. println(4); } }

24 public class Base. Class{ public void method () throws IOException {  . . .24 public class Base. Class{ public void method () throws IOException { . . . } } public class Legal. Three extends Base. Class { public void method () throws EOFException, Malformed. URLException { . . . } }public class Legal. One extends Base. Class { public void method () throws IOException { . . . } }public class Legal. Two extends Base. Class { public void method () { . . . } }

25 public class Base. Class{ public void method () throws IOException {  . . .25 public class Base. Class{ public void method () throws IOException { . . . } } public class Illegal. Two extends Base. Class { public void method () { . . . throw new Exception(); } }public class Illegal. One extends Base. Class { public void method () throws IOException, Illegal. Access. Exception { . . . } }

Цепочки исключений 26 Зачастую необходимо перехватить одно исключение и возбудить следующее, не потеряв при этом информацииЦепочки исключений 26 Зачастую необходимо перехватить одно исключение и возбудить следующее, не потеряв при этом информации о первом исключении — это называется цепочкой исключений ( exception chaining ). public Object set. Field(String id, Object value) throws Dynamic. Fields. Exception { if(value == null) { Dynamic. Fields. Exception dfe = new Dynamic. Fields. Exception(); dfe. init. Cause(new Null. Pointer. Exception()); throw dfe; } … }

27 Dynamic. Fields. Exception   at Dynamic. Fields. set. Field(Dynamic. Fields. java: 64)  27 Dynamic. Fields. Exception at Dynamic. Fields. set. Field(Dynamic. Fields. java: 64) at Dynamic. Fields. main(Dynamic. Fields. java: 94) Caused by: java. lang. Null. Pointer. Exception at Dynamic. Fields. set. Field(Dynamic. Fields. java: 66) . . . 1 more Цепочки исключений

Исключения в конструкторе • Генерировать исключения в конструкторе можно и нужно (в отличие от С++). Исключения в конструкторе • Генерировать исключения в конструкторе можно и нужно (в отличие от С++). • При возникновении исключения в конструкторе объект создан не будет. Результатом будет null. • Память под объект, которая уже была выделена, очистит сборщик мусора.