Successfully reported this slideshow.
Your SlideShare is downloading. ×

Урок 20. Обработка исключений в языке Java

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 60 Ad

Урок 20. Обработка исключений в языке Java

Download to read offline

Что такое исключение?
Обработка исключительных ситуаций.
Ключевые слова и общая форма блока обработки исключений.
Иерархия классов исключений.
Контролируемые и неконтролируемые исключения.
Применение нескольких операторов catch.
Вложенные операторы try.
Операторы throw, throws, finally.
Список подклассов не контролируемых и контролируемых исключений.
Создание собственных подклассов исключений.
Исключения при наследовании.
Multi-catch block.
Лекции, задания, видео, тесты и вопросы на:
https://www.examclouds.com/ru/java/java-core-russian/lesson17
Подписывайтесь на страницу:
https://www.facebook.com/Examclouds
Подписывайтесь на канал
https://www.youtube.com/c/tatyanamilkina

Что такое исключение?
Обработка исключительных ситуаций.
Ключевые слова и общая форма блока обработки исключений.
Иерархия классов исключений.
Контролируемые и неконтролируемые исключения.
Применение нескольких операторов catch.
Вложенные операторы try.
Операторы throw, throws, finally.
Список подклассов не контролируемых и контролируемых исключений.
Создание собственных подклассов исключений.
Исключения при наследовании.
Multi-catch block.
Лекции, задания, видео, тесты и вопросы на:
https://www.examclouds.com/ru/java/java-core-russian/lesson17
Подписывайтесь на страницу:
https://www.facebook.com/Examclouds
Подписывайтесь на канал
https://www.youtube.com/c/tatyanamilkina

Advertisement
Advertisement

More Related Content

Slideshows for you (16)

Similar to Урок 20. Обработка исключений в языке Java (20)

Advertisement

Recently uploaded (15)

Урок 20. Обработка исключений в языке Java

  1. 1. 1. Что такое исключение? 2. Обработка исключительных ситуаций 3. Ключевые слова и общая форма блока обработки исключений 4. Иерархия классов исключений 5. Контролируемые и неконтролируемые исключения 6. Применение нескольких операторов catch 7. Вложенные операторы try 8. Операторы throw, throws, finally 9. Список подклассов не контролируемых и контролируемых исключений 10. Создание собственных подклассов исключений 11. Исключения при наследовании 12. Multi-catch block www.examclouds.com
  2. 2. Что такое исключение?  Исключение - это ненормальная ситуация, возникающая во время выполнения последовательности кода. Иными словами, исключение - это ошибка, возникающая во время выполнения.  Исключение в Java представляет собой объект, описывающий исключительную (т.е. ошибочную) ситуацию, возникающую в определенной части программного кода. www.examclouds.com
  3. 3. Пример исключения public class ExceptionDemo1 { public static void main(String[] args) { subRoutine(); } public static void subRoutine() { int d = 0; int a = 10 / d; } } www.examclouds.com
  4. 4. Обработка исключительных ситуаций  Когда возникает исключительная ситуация, в вызвавшем ошибку методе генерируется объект, который представляет исключение.  Этот метод может обработать исключение самостоятельно или же пропустить его.  Так или иначе, в определенный момент исключение перехватывается и обрабатывается.  Исключения могут генерироваться автоматически исполняющей системой Jаvа или вручную в прикладном коде. www.examclouds.com
  5. 5. Ключевые слова  Управление обработкой исключений в Java осуществляется с помощью пяти ключевых слов:  try  catch  throw  throws  finally www.examclouds.com
  6. 6. Общая форма блока обработки исключений  public class ExceptionDemo1 { public static void main(String[] args) { try { // блок кода, в котором отслеживаются ошибки } catch (ExceptionType1 e) { // обработчик исключений типа ExceptionType1 } catch (ExceptionType2 e) { // обработчик исключений типа ExceptionType2 } finally { // блок кода, который должен быть выполнен после завершения блока try } } } www.examclouds.com
  7. 7. Иерархия классов исключений www.examclouds.com
  8. 8. Иерархия классов исключений  Исключения (Exceptions) являются результатом проблем в программе, которые в принципе решаемы и предсказуемы. Например, произошло деление на ноль в целых числах.  Ошибки (Errors) представляют собой более серьёзные проблемы, которые, согласно спецификации Java, не следует пытаться обрабатывать в собственной программе, поскольку они связаны с проблемами уровня JVM. Например, исключения такого рода возникают, если закончилась память, доступная виртуальной машине. Программа дополнительную память всё равно не сможет обеспечить для JVM. www.examclouds.com
  9. 9. Иерархия классов исключений  У класса Exception имеется важный подкласс - RuntimeException. Исключения этого типа автоматически определяются для создаваемых вами прикладных программ и охватывают такие ошибки, как деление на нуль и ошибочная индексация массивов. www.examclouds.com
  10. 10. Типы исключений  Неконтролируемые исключения (unchecked) - RuntimeException, Error и их наследники.  Контролируемые исключения (checked) - все остальные наследники класса Exception. www.examclouds.com
  11. 11. Пример контролируемого исключения ParseException  public class NumberFormatDemo4 { public static void main(String[] args) { NumberFormat nf = NumberFormat.getInstance(); try { System.out.println(nf.parse("1234,567")); nf.setParseIntegerOnly(true); System.out.println(nf.parse("1234,567")); } catch (ParseException pe) { System.out.println(“Parse exception"); } } } www.examclouds.com
  12. 12. Пример контролируемого исключения ParseException public class ExceptionDemo4 { public static void main(String[] args) { try { parseNumber("sss"); } catch (ParseException e) { System.out.println(e.getMessage()); } System.out.println("Конец программы."); } public static void parseNumber(String str) throws ParseException { NumberFormat nf = NumberFormat.getInstance(); System.out.println(nf.parse(str)); } } www.examclouds.com
  13. 13. Пример неконтролируемого исключения ArithmeticException public class ExceptionDemo1 { public static void main(String[] args) { subRoutine(); } public static void subRoutine() { int d = 0; int a = 10 / d; } } www.examclouds.com
  14. 14. Пример неконтролируемого исключения ArrayIndexOutOfBoundsException public class ExceptionDemo2 { public static void main(String[] args) { int[] array = new int[3]; System.out.println(array[4]); } } www.examclouds.com
  15. 15. Пример StackOverflowError public class StackOverflowErrorExample { public static void main(String[] args) { System.out.println("1"); main(args); } } www.examclouds.com
  16. 16. Пример ClassCastException  public class ClassCastExceptionExample { public static void main(String[] args) { method(new int[0]); } private static void method(Object arg) { String x = (String) arg; } } www.examclouds.com
  17. 17. Пример ClassNotFoundException public class ClassNotFoundExceptionExample { public static void main(String[] args) throws ClassNotFoundException Class clazz0 = Integer.class; Class clazz1 = "Hello".getClass(); Class clazz2 = Class.forName("com.lib.MyClass"); } } www.examclouds.com
  18. 18. Пример NullPointerException public class NullPointerExceptionExample { public static void main(String[] args) { String str = null; System.out.println(str.length()); } } www.examclouds.com
  19. 19. Подклассы не контролируемых исключений, производные от класса RunTimeException Исключение Значение ArithmeticException Арифметическая ошибка типа деления на нуль ArrayIndexOutOfBoundsException Индекс массива находится вне границ ArrayStoreException Назначение элементу массива несовместимого типа ClassCastException Недопустимое приведение типов IllegalArgumentException При вызове метода использован незаконный аргумент IllegalMonitorStateException Незаконная операция монитора, типа ожидания на разблокированном потоке IllegalStateException Среда или приложение находятся в некорректном состоянии IllegalThreadStateException Требуемая операция не совместима с текущим состоянием потока IndexOutOfBoundsException Некоторый тип индекса находится вне границ NegativeArraySizeException Массив создавался с отрицательным размером NullPointerException Недопустимое использование нулевой ссылки www.examclouds.com
  20. 20. Подклассы не контролируемых исключений, производные от класса RunTimeException Исключение Значение NumberFormatException Недопустимое преобразование строки в числовой формат SecurityException Попытка нарушить защиту StringIndexOutOfBoundsException Попытка индексировать вне границ строки UnsupportedOperationException Встретилась не поддерживаемая операция www.examclouds.com
  21. 21. Подклассы контролируемых исключений Исключение Значение ClassNotFoundException Класс не найден CloneNotSupportedException Попытка клонировать объект, который не реализует интерфейс Cloneable IllegalAccessException Доступ к классу отклонен InstantiationException Попытка создавать объект абстрактного класса или интерфейса InterruptedException Один поток был прерван другим потоком NoSuchFieldException Требуемое поле не существует NoSuchMethodException Требуемый метод не существует www.examclouds.com
  22. 22. Методы, определенные в классе Throwable Метод Описание Тhrowable getCause() Возвращает исключение, положенное в основу текущего исключения. Если такое исключение отсутствует, то возвращается пустое значение null. String getLocalizedMessage() Возвращает локализованное описание исключения. String getMessage() Возвращает описание исключения. StackTraceElement[] getStackTrace() Возвращает массив, содержащий поэлементную трассировку стека в виде объектов класса StackTraceElement. На вершине стека находится метод, который был вызван непосредственно перед генерированием исключения. Этот метод содержится в первом элементе массива. Класс StackTraceElement предоставляет доступ к данным о каждом элементе трассировки, например к имени вызванного метода. www.examclouds.com
  23. 23. Методы, определенные в классе Throwable Метод Описание void printStackTrace() Отображает трассу стека. void printStackTrace(PrintStream stream) Посылает трассу стека указанному потоку. void printStackTrace(PrintWriter stream) Посылает проекцию прямой стека указанному потоку. String toString() Возвращает String-объект, содержащий описание исключения. Этот метод вызывается из println() при выводе Throwable-объекта. www.examclouds.com
  24. 24. Использование метода getMessage() public class ExceptionDemo4 { public static void main(String[] args) { try { parseNumber("Какое-то число."); } catch (ParseException e) { System.out.println(e.getMessage()); } System.out.println("Конец программы."); } public static void parseNumber(String str) throws ParseExce NumberFormat nf = NumberFormat.getInstance(); System.out.println(nf.parse(str)); } } www.examclouds.com
  25. 25. Использование метода printStackTrace() public class ExceptionDemo5 { public static void main(String[] args) { try { parseNumber("Какое-то число."); } catch (ParseException e) { e.printStackTrace(); } System.out.println("Конец программы."); } public static void parseNumber(String str) throws ParseExce NumberFormat nf = NumberFormat.getInstance(); System.out.println(nf.parse(str)); } } www.examclouds.com
  26. 26. Использование метода getStackTrace() public class ExceptionDemo6 { public static void main(String[] args) { try { NumberFormat nf = NumberFormat.getInstance(); System.out.println(nf.parse("Какое-то число")); } catch (ParseException e) { StackTraceElement[] stackTraceElements = e.getStackT System.out.println(Arrays.toString(stackTraceElement } System.out.println("Конец программы."); } } www.examclouds.com
  27. 27. Создание собственных подклассов исключений  Для того чтобы создать класс собственного исключения, достаточно определить его как производный от класса Exception.  В подклассах собственных исключений совсем не обязательно реализовать что-нибудь.  В самом классе Exception не определено никаких методов.  Зачастую указывать описание исключения непосредственно при его создании очень удобно, но иногда для этого лучше переопределить метод toString(). www.examclouds.com
  28. 28. Создание собственных подклассов исключений public class MyException extends Exception { private int detail; public MyException(int detail, String message) { super(message); this.detail = detail; } @Override public String toString() { return "MyException{" + "detail=" + detail + ", message=" + getMessage() + "} "; } } www.examclouds.com
  29. 29. Создание собственных подклассов исключений public class MyExceptionDemo { public static void main(String[] args) { try { compute(1); compute(20); } catch (MyException e) { System.out.println("Перехваченное исключение." + e); } } public static void compute(int a) throws MyException { System.out.println("Вызван метод compute(" + a + ")"); if (a > 10) { throw new MyException(a, "Some message"); } System.out.println("Нормальное завершение."); } } www.examclouds.com
  30. 30. Оператор throw  Исключения можно генерировать и непосредственно в прикладной программе, используя оператор throw.  Общая форма: throw throwableInstance;  throwableInstance должен быть объектом класса Throwable или производного от него подкласса.  Примитивные типы вроде int или char, а также классы, кроме Throwable нельзя использовать для генерирования исключений.  Получить объект класса Throwable можно двумя способами, указав соответствующий параметр в операторе catch или создав этот объект с помощью оператора new. www.examclouds.com
  31. 31. Оператор throw public class ThrowDemo { public static void doSomething() { try { throw new NullPointerException("demo"); } catch (NullPointerException e) { System.out.println("Перехвачено внутри doSomething."); throw e; // повторно возбудить исключение } } public static void main(String[] args) { try { doSomething(); } catch (NullPointerException e) { System.out.println("ПОВТОРНЫЙ перехват: " + e); } } } www.examclouds.com
  32. 32. Задание 1  Создать пользовательские классы исключения WrongPasswordException и WrongLoginException с двумя конструкторами – один по умолчанию, второй принимает сообщение исключения и передает его в конструктор класса Exception. www.examclouds.com
  33. 33. Оператор throws  Если метод способен вызвать исключение, которое он сам не обрабатывает, то он должен задать свое поведение таким образом, чтобы вызывающий его код мог обезопасить себя от такого исключения.  С этой целью в объявление метода вводится оператор throws, где перечисляются типы исключений, которые метод может генерировать.  Это обязательно для всех исключений, кроме тех, которые относятся к классам Error и RuntimeException или любым их подклассам.  Все остальные исключения, которые может сгенерировать метод, должны быть объявлены в операторе throws. Если этого не сделать, то во время компиляции возникнет ошибка. www.examclouds.com
  34. 34. Оператор throws public class ThrowsGenerate { public static void throwOne() throws IllegalAccessException { System.out.println("Внутри throwOne."); throw new IllegalAccessException("demo"); } public static void main(String[] args) { try { throwOne(); } catch (IllegalAccessException e) { System.out.println("Выброс " + e); } } } www.examclouds.com
  35. 35. Задание 2  Создать статический метод который принимает на вход три параметра: login, password и confirmPassword.  Длина login должна быть меньше 20 символов. Если login не соответствует этим требованиям, необходимо выбросить WrongLoginException.  Длина password должна быть меньше 20 символов. Также password и confirmPassword должны быть равны. Если password не соответствует этим требованиям, необходимо выбросить WrongPasswordException.  Метод не обрабатывает эти исключения.  Метод возвращает true, если значения верны или false в другом случае. www.examclouds.com
  36. 36. Применение нескольких операторов catch  В некоторых случаях один фрагмент кода может инициировать более одного исключения.  Используется два или более операторов catch, каждый для перехвата своего типа исключений.  Когда возбуждается исключение, каждый оператор catch проверяется по порядку, и первый из них, чей тип соответствует исключению, выполняется.  После того, как выполнится один из операторов catch, все остальные пропускаются, и выполнение программы продолжается с места, следующего за блоком try/catch. www.examclouds.com
  37. 37. Применение нескольких операторов catch public class MultiCatch { public static void main(String[] args) { try { int a = args.length; int b = 42 / a; int[] c = new int[a]; c[a] = 6; } catch (ArithmeticException e) { System.out.println("Деление на ноль." + e); } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); } System.out.println("Уже после блока try-catch-catch."); } } www.examclouds.com
  38. 38. Применение нескольких операторов catch  Когда используются множественные операторы catch, важно помнить, что подклассы исключений должны следовать перед любыми их суперклассами.  Это потому, что оператор catch, который использует суперкласс, будет перехватывать все исключения этого суперкласса плюс всех его подклассов.  То есть подкласс исключения никогда не будет обработан, если вы попытаетесь его перехватить после его суперкласса.  Более того, в Java недостижимый код является ошибкой. www.examclouds.com
  39. 39. Применение нескольких операторов catch public class SuperSubCatch { public static void main(String[] args) { try { int a = 0; int b = 42 / a; } catch (Exception e) { System.out.println("Перехват исключений общего класса Excepti } /*catch (ArithmeticException e) { //ОШИБКА: недостижимый код ! System.out.println("Этoт код вообще недостижим."); }*/ } } www.examclouds.com
  40. 40. Задание 3  Перехват и обработка исключений должны происходить в вызывающем методе. www.examclouds.com
  41. 41. Объявление нескольких исключений в одном блоке catch (multi-catch block)  Было: try { ... } catch(IllegalStateException e){ System.out.println(e.getMessage()); } catch(SQLException e){ System.out.println(e.getMessage()); } catch(ContextException e){ System.out.println(e.getMessage()); }  Стало после Java 7: try { ... } catch(IllegalStateException | SQLException | ContextException e){ System.out.println(e.getMessage()); } www.examclouds.com
  42. 42. Пример public class MultiCatch2 { public static void main(String[] args) { try { int a = args.length; int b = 42 / a; int[] c = new int[a]; c[a] = 6; } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println("Ошибка." + e); } System.out.println("Уже после блока try-catch."); } } www.examclouds.com
  43. 43. Объявление нескольких исключений в одном блоке catch  Параметр оператора catch должен быть фактически завершенным (effective final). Это означает, что ему нельзя присваивать новое значение в блоке оператора catch или же он должен быть явно объявлен как final.  Multi-catch block может содержать только исключения не входящие в одну иерархию. www.examclouds.com
  44. 44. Задание 4  Переделываем задание используя multi-catch block. www.examclouds.com
  45. 45. Оператор finally  Когда генерируется исключение, выполнение метода направляется по нелинейному пути.  Если файл открывается в начале метода и закрывается в конце, то вряд ли кого-нибудь устроит, что код, закрывающий файл, будет обойден механизмом обработки исключений.  Для таких непредвиденных обстоятельств и служит оператор finallу. www.examclouds.com
  46. 46. Оператор finally  Оператор finallу образует блок кода, который будет выполнен по завершении блока операторов try/catch, но перед следующим за ним кодом.  Блок оператора finallу выполняется независимо от того, сгенерировано ли исключение или нет.  Если исключение сгенерировано, блок оператора finallу выполняется, даже при условии, что ни один из операторов catch не совпадает с этим исключением.  В любой момент, когда метод собирается возвратить управление вызывающему коду из блока оператора try/саtch (через необработанное исключение или явным образом через оператор return), блок оператора finallу выполняется перед возвратом управления из метода. www.examclouds.com
  47. 47. Оператор finally public class FinallyUse { public static void procA() { try { System.out.println("Внутри procA"); throw new RuntimeException("demo"); } finally { System.out.println("finally для procA "); } } public static void procB() { try { System.out.println("Внутри procB"); return; } finally { System.out.println("finally для procB "); } } public static void procC() { try { System.out.println("Внутри procC"); } finally { System.out.println("finally procC"); } } public static void main(String[] args) { try { procA(); } catch (Exception e) { System.out.println("Исключение выброшено"); } procB(); procC(); } www.examclouds.com
  48. 48. Задание 5  Добавляем блок finally, в котором просто выводим значения login, password и confirmPassword. www.examclouds.com
  49. 49. Исключения при наследовании  Существует два правила для контролируемых исключений при наследовании: • Переопределяемый метод в подклассе не может выбрасывать контролируемые исключения, которые выше по иерархии чем исключения в методе суперкласса. • Конструктор подкласса должен включить в свой блок throws все классы исключений или их суперклассы из блока throws конструктора суперкласса, к которому он обращается при создании объекта. www.examclouds.com
  50. 50. Исключения при наследовании public class SuperClass { public SuperClass() throws IOException { } public void start() throws IOException { } } public class SubClass extends SuperClass { public SubClass() throws IOException, ArithmeticException { } public void start() throws FileNotFoundException { } } www.examclouds.com
  51. 51. Исключение в конструкторе  Если в конструкторе будет выброшено исключение, объект создан не будет. public class ConstructorException { private int i; public ConstructorException(int i) { this.i = 20 / i; } public int getI() { return i; } public static void main(String[] args) { ConstructorException p = null; try { p = new ConstructorException(0); } catch (ArithmeticException e) { System.out.println("Гасим исключение конструктора."); } System.out.println(p.getI()); } } www.examclouds.com
  52. 52. Вопрос 1  Будет ли вызван код в блоке finally() если в try вызывать System.exit(0)? www.examclouds.com
  53. 53. Вопрос 1  Будет ли вызван код в блоке finally() если в try вызывать System.exit(0)?  Нет. www.examclouds.com
  54. 54. Вопрос 2  Возможно ли использование блока try-finally (без catch)? www.examclouds.com
  55. 55. Вопрос 2  Возможно ли использование блока try-finally (без catch)?  Да. www.examclouds.com
  56. 56. Вопрос 3  Предположим, есть блок try-finally.  В блоке try возникло исключение и выполнение переместилось в блок finally.  В блоке finally тоже возникло исключение.  Какое из двух исключений “выпадет” из блока try-finally? Что случится со вторым исключением? www.examclouds.com
  57. 57. Вопрос 3  Предположим, есть блок try-finally.  В блоке try возникло исключение и выполнение переместилось в блок finally.  В блоке finally тоже возникло исключение.  Какое из двух исключений “выпадет” из блока try- finally? Что случится со вторым исключением?  Из блока try finally выпадет второе исключение, которое случилось в блоке finally, первое будет утеряно. www.examclouds.com
  58. 58. Вопрос 4  Предположим, есть метод, который может выбросить IOException и FileNotFoundException.  В какой последовательности должны идти блоки catch? (FileNotFoundException является наследником IOException). Сколько блоков catch будет выполнено? www.examclouds.com
  59. 59. Вопрос 4  Предположим, есть метод, который может выбросить IOException и FileNotFoundException. В какой последовательности должны идти блоки catch? (FileNotFoundException является наследником IOException). Сколько блоков catch будет выполнено?  Если срабатывает один из блоков catch, то остальные блоки в данной конструкции try-catch выполняться не будут.  Блоки должны идти от наследника к родителю то есть: try{} catch(FileNotFoundException e){} catch(IOException e){} www.examclouds.com
  60. 60. • Лекции, задания, видео, тесты и вопросы на: • https://www.examclouds.com/ru/java/java-core- russian/lesson17 • Подписывайтесь на страницу: • https://www.facebook.com/Examclouds • Подписывайтесь на канал • https://www.youtube.com/c/tatyanamilkina www.examclouds.com

×