Що таке виняток Java




Що таке виняток Java



21. Java – Винятки

Виняток у Java є проблемою, яка виникає в ході виконання програми. У разі виникнення в Java виключення (exception), або виняткової події, має місце припинення нормальної течії програми, і програма/додаток завершуються в аварійному режимі, що не є рекомендованим, і, як наслідок, подібні випадки вимагають Java оброблення винятків.

Причини виникнення виключення

Існує безліч причин, які можуть спричинити виникнення винятку. Далі розглянуто низку подібних сценаріїв, у тих яких може статися виняток:

  • Користувач запровадив неприпустимі дані.
  • Файл, який потрібно відкрити, не знайдено.
  • З'єднання з мережею втрачено у процесі передачі чи JVM вичерпала наявний обсяг пам'яті.

Деякі з цих винятків викликані помилкою користувача, інші – програмною помилкою, в деяких випадках, причиною цього може послужити збій у матеріальних ресурсах.

Виходячи з наведених відомостей, ми можемо позначити три типи винятків. Знання цих типів дозволить вам надалі вирішувати проблемні ситуації, пов'язані з винятками. Нижче розглянемо список винятків Java з прикладами.

  • Контрольовані винятки – контрольований виняток є вид винятку, що відбувається на стадії компіляції, їх називають винятками періоду компіляції. Зазначені винятки не слід ігнорувати в ході компіляції, вони вимагають належного поводження з програміста.

Наприклад, якщо ви використовуєте клас FileReader у вашій програмі для зчитування даних із файлу, у разі, якщо вказаний у конструкторі файл не існує, відбувається FileNotFoundException, і компілятор нагадує програмісту обробку цього виключення.

Приклад 1

import java.io.File; import java.io.FileReader; public class Test < public static void main(String args[]) < File f = new File("D://java/file.txt"); FileReader fr = новий FileReader(f); >>

При спробі компіляції зазначеної вище програми буде виведено такі винятки:

C:\>javac Test.java Test.java:8: error: unreported exception FileNotFoundException; мусить бути caught or declared to be thrown FileReader fr = new FileReader(f); ^ 1 error

Примітка. Зважаючи на те, що методи read() і close() класу FileReader викликають IOException, компілятор може повідомити вас про обробку IOException, спільно з FileNotFoundException.

  • Неконтрольовані винятки – неконтрольований виняток є винятком, який відбувається під час виконання. Вони також мають назву винятки на етапі виконання. Ця категорія може містити похибки програмування, такі як логічні помилки або неправильний спосіб використання API. Винятки на етапі виконання ігноруються під час компіляції.

Наприклад, якщо вами у вашій програмі був оголошений масив із 5 елементів, спроба виклику 6-го елемента масиву спричинить виникнення ArrayIndexOutOfBoundsExceptionexception.

Приклад 2

public class Test < public static void main(String args[]) < int array[] = ; System.out.println(array[4]); > >

При компіляції та виконанні зазначеної вище програми буде отримано такий виняток:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at Exceptions.Test.main(Test.java:8)
  • Помилки – не є винятками, проте становлять проблеми, які виникають незалежно від користувача чи програміста. Помилки у вашому коді зазвичай ігноруються через те, що в окремих випадках їх обробка виявиться результативною. Наприклад, помилка з'явиться при переповненні стека. На етапі компіляції вони ігноруються.

Ієрархія винятків

Усі класи винятків Java представляють підтипи класу java.lang.Exception.Клас винятків є підклас класу Throwable. Крім класу винятків, існує також підклас помилок, що утворилися з класу Throwable.

Помилки є аварійним станом внаслідок значних збоїв, які не обробляються програмами Java. Генерування помилок призначене для відображення помилок, виявлених середовищем виконання. Приклади: JVM вичерпав наявний обсяг пам'яті. Зазвичай програми не можуть відновити проблеми, викликані помилками.

Клас винятків поділяється на два основні підкласи: клас IOException та клас RuntimeException.

За посиланням представлений перелік найбільш поширених контрольованих (checked) і неконтрольованих (unchecked) вбудованих винятків Java.

Методи винятків

Далі наведено список важливих методів, доступних у класі Throwable.

Метод та опис
1 public String getMessage()
Повернення докладного повідомлення про виключення. Ініціалізація цього повідомлення проводиться у конструкторі Throwable.
2 public Throwable getCause()
Повернення причин виключення, представленої об'єктом Throwable.
3 public String toString()
Повернення імені класу, з'єднаного з результатом getMessage().
4 public void printStackTrace()
Виведення результату toString() разом із трасуванням стека в System.err, потік виведення помилок.
5 public StackTraceElement [] getStackTrace()
Повернення масиву, що містить кожен елемент у трасуванні стека. Елемент з номером 0 являє собою вершину стека викликів, останній елемент масиву відображає метод на дні стека викликів.
6 public Throwable fillInStackTrace()
Заповнює трасування стека даного об'єкта Throwable поточним трасуванням стека, доповнюючи будь-яку попередню інформацію в трасуванні стека.

Обробка винятків – try та catch

Метод здійснює обробку виключення під час використання ключових слів try і catch.

Опис

Блок try/catch розміщується на початку та наприкінці коду, який може згенерувати виняток.Код у складі блоку try/catch є захищеним кодом, синтаксис використання try/catch виглядає так:

try < // Захищений код >catch(НазваВиключення e1) < // Блок catch >

Код, схильний до винятків, розміщується у блоці try. У разі виключення, обробка даного виключення буде здійснюватися відповідним блоком catch. За кожним блоком try повинен негайно слідувати блок catch чи блок finally.

Оператор catch включає оголошення типу виключення, яке має бути оброблено. У разі виключення в захищеному коді, блок catch (чи блоки), наступний за try, буде перевірено. У випадку, якщо тип виключення представлений в блоці catch, виняток передається в блок catch аналогічно тому, як аргумент передається в параметр методу.

приклад

Нижче представлений масив із заявленими двома елементами. Спроба коду отримати доступ до третього елементу масиву спричинить генерацію виключення.

import java.io.*; public class Test < public static void main(String args[]) < try < int array[] = new int[2]; System.out.println("Доступ до третього елемента:" + array[3]); >catch(ArrayIndexOutOfBoundsException e) < System.out.println("Виключення:" + e); >System.out.println("Поза блоком"); > >

Внаслідок цього буде отримано наступний результат:

Виняток:java.lang.ArrayIndexOutOfBoundsException: 3 Поза блоком

Багаторазові блоки catch

За блоком try можуть йти кілька блоків catch. Синтаксис багаторазових блоків catch виглядає так:

try < // Захищений код >catch(ВинятокТип1 e1) < // Блок catch >catch(ВиключенняТип2 e2) < // Блок catch >catch(ВинятокТип3 e3) < // Блок catch >

Представлені вище оператори демонструють три блоки catch, однак після одноразового try кількість даних використовуваних блоків може бути довільним. У разі виникнення виключення в захищеному коді виняток виводиться в перший блок catch у списку.Якщо тип даних виключення, що генерується, збігається з Винятком Тип1, він перехоплюється у зазначеній області. У протилежному випадку виняток переходить до другого оператора catch. Це триває до тих пір, поки не буде зроблено перехоплення виключення, або воно не пройде через всі оператори, у разі чого виконання поточного методу буде припинено, і виняток буде перенесено до попереднього методу стеку викликів.

приклад

Далі представлений сегмент коду, що демонструє використання багаторазових операторів try/catch.

try <file = new FileInputStream(fileName); x = (byte) file.read(); >catch(IOException e1) < e1.printStackTrace(); return -1; > catch (FileNotFoundException e2) // Недійсно!

Перехоплення багатотипних винятків

У середовищі Java 7, Ви можете зробити обробку більш ніж одного винятку при використанні одного блоку catch, ця властивість спрощує код. Нижче представлена ​​модель реалізації:

catch (IOException|FileNotFoundException ex) < logger.log(ex); throw ex;

Ключові слова throws/throw

Якщо метод не може здійснити обробку контрольованого виключення, здійснюється повідомлення при використанні ключового слова throws в Java. Ключове слово throws з'являється в кінці методу сигнатури.

При використанні ключового слова throw ви можете зробити обробку виявленого виключення або виключення, яке було тільки що перехоплено.

Слід уважно розрізняти ключові слова throw і throws Java, так як throws використовується для відкладеної обробки контрольованого виключення, а throw, у свою чергу, використовується для виклику заданого виключення.

Нижче наведений метод показує, що ним генерується RemoteException:

Приклад 1

import java.rmi.RemoteException; public class Test < public void deposit(double amount) throws RemoteException < // Реалізація методу throw new RemoteException(); >// Залишок визначення класу >

Метод також може оголосити про те, що їм генерується більш ніж один виняток, у разі чого винятки подаються у вигляді переліку, відокремлені один від одного комами. Наприклад, наступний метод повідомляє про те, що їм генеруються RemoteException і InsufficientFundsException:

Приклад 2

import java.rmi.RemoteException; Public class Test < public void withdraw(double amount) throws RemoteException, InsufficientFundsException < // Реалізація методу >// Залишок визначення класу >

Блок finally

У Java finally слід за блоком try чи блоком catch. Блок finally у коді виконується завжди незалежно від наявності винятку.

Використання блоку finally дозволяє запустити оператор, призначений для очищення, незалежно від того, що відбувається в захищеному коді.

Блок finally в Java з'являється після закінчення блоків catch, його синтаксис виглядає так:

Синтаксис

try < // Захищений код >catch(ВинятокТип1 e1) < // Блок catch >catch(ВиключенняТип2 e2) < // Блок catch >catch(ВинятокТип3 e3) < // Блок catch >finally < // Блок finally завжди виконується. >

приклад

public class Test << static void main(String args[]) < int array[] = new int[2]; try < System.out.println("Доступ до третього елемента:" + array[3]); >catch(ArrayIndexOutOfBoundsException e) < System.out.println("Виключення:" + e); >finally <array[0] = 6; System.out.println("Значення першого елемента: " + array[0]); System.out.println("Оператор finally виконаний."); >> >

Внаслідок цього буде отримано наступний результат:

Виняток:java.lang.ArrayIndexOutOfBoundsException: 3 Значення першого елемента: 6 Оператор finally виконаний.
  • Вираз catch не може існувати без оператора try.
  • За наявності блоку try/catch, вираз finally не є обов'язковим.
  • Блок try неспроможна існувати за відсутності виразу catch чи висловлювання finally.
  • Існування будь-якого коду у проміжку між блоками try, catch, finally є неможливим.

Конструкція try-with-resources

У нормі, при використанні різних видів ресурсів, таких як потоки, з'єднання та ін, нам належить закрити їх безпосередньо при використанні блоку finally. .

Приклад 1

import java.io.FileReader; import java.io.File; import java.io.IOException; public class static file.txt"); fr = new FileReader(f); char [] array = new char[10]; fr.read(array); // читання вмісту масиву for(char c : array) System.out.print(c); e1.printStackTrace(); >finally < try. fr.close(); e2.printStackTrace();

Конструкція try-with-resources, також називається як автоматичне керування ресурсами, представляє новий механізм обробки винятків, який був представлений у 7-й версії Java, здійснюючи автоматичне закриття всіх ресурсів, що використовуються в рамках блоку try catch.

Щоб скористатися даним оператором, вам потрібно лише розмістити задані ресурси в круглих дужках, після чого створений ресурс буде автоматично закритий після закінчення блоку Нижче представлений синтаксис конструкції try-with-resources.

Синтаксис

try(FileReader fr = new FileReader("Шлях до файлу")) < // використання ресурсу >catch() < // тіло catch >>

Програма нижче зчитує дані у файлі, використовуючи конструкцію try-with-resources.

Приклад 2

import java.io.FileReader; import java.io.IOException; public class Test < public static void main(String args[]) < try(FileReader fr = новий FileReader("E://Soft/NetBeans 8.2/Projects/test/test/file.txt")) < char [] array = New char [10]; fr.read(array); // Читання вмісту масиву for(char c: array) System.out.print(c); // виведення символів на екран, один за одним > catch (IOException e) < e.printStackTrace (); >> >

При роботі з конструкцією try-with-resources слід брати до уваги такі нюанси:

  • Для використання конструкції try-with-resources слід реалізувати інтерфейс AutoCloseable, після чого відповідний метод close() буде викликаний автоматично під час виконання.
  • У конструкції try-with-resources можливе вказівку одного і більше класів.
  • При вказівці кількох класів у блоці try конструкції try-with-resources закриття даних класів буде здійснюватися у зворотному порядку.
  • За винятком внесення ресурсів у дужки, всі елементи є рівними аналогічно до нормального блоку try/catch у складі блоку try.
  • Ресурси, внесені до try, конкретизуються до запуску блоку try.
  • Ресурси у складі блоку try вказуються як остаточні.

Створення власних винятків

Ви можете створити власні винятки в середовищі Java. При записі своїх класів винятків слід брати до уваги такі аспекты:

  • Усі винятки мають бути дочірніми елементами Throwable.
  • Якщо ви плануєте зробити запис контрольованого виключення з автоматичним використанням за рахунок правила обробки чи оголошення, вам слід розширити клас Exception.
  • Якщо ви хочете зробити запис виключення на етапі виконання, вам слід розширити клас RuntimeException.

Ви можете визначити власний клас винятків, як показано нижче:

class MyException extends Exception

Вам необхідно розширити певний клас Exception з метою створення власного виключення.Ця категорія відноситься до контрольованих винятків. Наступний клас InsufficientFundsException виняткових ситуацій, визначених користувачем, розширює клас Exception, роблячи його контрольованим винятком. Клас винятків, подібно до всіх інших класів, містить використовувані області та методи.

приклад

// Назва файлу InsufficientFundsException.java import java.io.*; public class InsufficientFundsException extends Exception < private double amount; public InsufficientFundsException(double amount) < this.amount = amount; >public double getAmount() < return amount; >>

З метою демонстрації наших винятків, визначених користувачем, наступний клас Checking містить метод withdraw(), що генерує InsufficientFundsException.

// Назва файлу Checking.java import java.io. *; public class Checking < private int number; private double balance; public Checking(int number) < this.number = number; >public void deposit(double amount) < balance += amount; >public void withdraw(double amount) throws InsufficientFundsException < if(amount else < double needs = amount - balance; throw new InsufficientFundsException(needs); >> public double getBalance() < return balance; ;

Наступна програма Bank демонструє виклик методів deposit() та withdraw() класу Checking.

// Назва файлу Bank.java public class Bank < public static void main(String [] args) < Checking c = new Checking(101); System.out.println("Депозит $300. "); c.deposit(300.00); try < System.out.println("\nЗняття $100. "); c.withdraw(100.00); System.out.println("\nЗняття $400. "); c.withdraw(400.00); >catch(InsufficientFundsException e) < System.out.println("Вибачте, але у Вас $" + e.getAmount()); e.printStackTrace(); >> >

Скомпілюйте всі три вище зазначені файли та здійсніть запуск Bank. Внаслідок цього буде отримано наступний результат:

Депозит $300. Зняття $100. Зняття $400.Вибачте, але у Вас $200.0 InsufficientFundsException на Checking.withdraw(Checking.java:25) на Bank.main(Bank.java:13)

Загальні винятки

У Java можна виділити дві категорії винятків та помилок.

  • Винятки JVM – дана група представлена ​​винятками/помилками, що викликаються безпосередньо та логічно з боку JVM. Приклади: NullPointerException, ArrayIndexOutOfBoundsException, ClassCastException.
  • Програмні винятки - Дані винятки викликаються безпосередньо додатком або програмістами API. Приклади: IlegallegalArgumentException, IlegallegalException.

Зміст

  • 1. Java - Самовчитель для початківців
  • 2. Java – Огляд мови
  • 3. Java – Встановлення та налаштування
  • 4. Java – Синтаксис
  • 5. Java – Класи та об'єкти
  • 6. Java – Конструктори
  • 7. Java – Типи даних та літерали
  • 8. Java - Типи змінних
  • 9. Java – Модифікатори
  • 10. Java – Оператори
  • 11. Java – Цикли та оператори циклу
  • 11.1. Java – Цикл while
  • 11.2. Java – Цикл for
  • 11.3. Java – Поліпшений цикл for
  • 11.4. Java – Цикл do..while
  • 11.5. Java – Оператор break
  • 11.6. Java – Оператор continue
  • 12. Java - Оператори прийняття рішень
  • 12.1. Java – Оператор if
  • 12.2. Java – Оператор if..else
  • 12.3. Java – Вкладений оператор if
  • 12.4. Java – Оператор switch..case
  • 12.5. Java – Умовний оператор (?:)
  • 13. Java – Числа
  • 13.1. Java – Методи byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
  • 13.2. Java – Метод compareTo()
  • 13.3. Java – Метод equals()
  • 13.4. Java – Метод valueOf()
  • 13.5. Java – Метод toString()
  • 13.6. Java – Метод parseInt()
  • 13.7. Java – Метод Math.abs()
  • 13.8. Java – Метод Math.ceil()
  • 13.9. Java – Метод Math.floor()
  • 13.10. Java - Метод Math.rint()
  • 13.11. Java – Метод Math.round()
  • 13.12. Java – Метод Math.min()
  • 13.13. Java – Метод Math.max()
  • 13.14. Java – Метод Math.exp()
  • 13.15. Java – Метод Math.log()
  • 13.16. Java – Метод Math.pow()
  • 13.17. Java – Метод Math.sqrt()
  • 13.18. Java – Метод Math.sin()
  • 13.19. Java – Метод Math.cos()
  • 13.20.Java – Метод Math.tan()
  • 13.21. Java – Метод Math.asin()
  • 13.22. Java – Метод Math.acos()
  • 13.23. Java – Метод Math.atan()
  • 13.24. Java – Метод Math.atan2()
  • 13.25. Java – Метод Math.toDegrees()
  • 13.26. Java – Метод Math.toRadians()
  • 13.27. Java – Метод Math.random()
  • 14. Java – Символи
  • 14.1. Java – Метод Character.isLetter()
  • 14.2. Java – Метод Character.isDigit()
  • 14.3. Java – Метод Character.isWhitespace()
  • 14.4. Java – Метод Character.isUpperCase()
  • 14.5. Java – Метод Character.isLowerCase()
  • 14.6. Java – Метод Character.toUpperCase()
  • 14.7. Java – Метод Character.toLowerCase()
  • 14.8. Java – Метод Character.toString()
  • 15. Java – Рядки
  • 15.1. Java – Метод charAt()
  • 15.2. Java – Метод compareTo()
  • 15.3. Java – Метод compareToIgnoreCase()
  • 15.4. Java – Метод concat()
  • 15.5. Java – Метод contentEquals()
  • 15.6. Java – Метод copyValueOf()
  • 15.7. Java – Метод endsWith()
  • 15.8. Java – Метод equals()
  • 15.9. Java - Метод equalsIgnoreCase()
  • 15.10. Java – Метод getBytes()
  • 15.11. Java – Метод getChars()
  • 15.12. Java – Метод hashCode()
  • 15.13. Java - Метод indexOf()
  • 15.14. Java – Метод intern()
  • 15.15. Java - Метод lastIndexOf()
  • 15.16. Java – Метод length()
  • 15.17. Java – Метод matches()
  • 15.18. Java – Метод regionMatches()
  • 15.19. Java – Метод replace()
  • 15.20. Java – Метод replaceAll()
  • 15.21. Java – Метод replaceFirst()
  • 15.22. Java – Метод split()
  • 15.23. Java – Метод startsWith()
  • 15.24. Java – Метод subSequence()
  • 15.25. Java – Метод substring()
  • 15.26. Java – Метод toCharArray()
  • 15.27. Java – Метод toLowerCase()
  • 15.28. Java – Метод toString()
  • 15.29. Java – Метод toUpperCase()
  • 15.30. Java – Метод trim()
  • 15.31. Java – Метод valueOf()
  • 15.32. Java – Класи StringBuilder та StringBuffer
  • 15.32.1. Java – Метод append()
  • 15.32.2. Java – Метод reverse()
  • 15.32.3. Java – Метод delete()
  • 15.32.4. Java – Метод insert()
  • 15.32.5. Java – Метод replace()
  • 16. Java – Масиви
  • 17. Java – Дата та час
  • 18. Java - Регулярні вирази
  • 19. Java - Методи
  • 20.Java – Потоки вводу/виводу, файли та каталоги
  • 20.1. Java – Клас ByteArrayInputStream
  • 20.2. Java – Клас DataInputStream
  • 20.3. Java – Клас ByteArrayOutputStream
  • 20.4. Java – Клас DataOutputStream
  • 20.5. Java – Клас File
  • 20.6. Java – Клас FileReader
  • 20.7. Java – Клас FileWriter
  • 21. Java – Винятки
  • 21.1. Java – Вбудовані винятки
  • 22. Java – Вкладені та внутрішні класи
  • 23. Java – Спадкування
  • 24. Java – Перевизначення
  • 25. Java – Поліморфізм
  • 26. Java – Абстракція
  • 27. Java - Інкапсуляція
  • 28. Java – Інтерфейси
  • 29. Java – Пакети
  • 30. Java – Структури даних
  • 30.1. Java – Інтерфейс Enumeration
  • 30.2. Java – Клас BitSet
  • 30.3. Java – Клас Vector
  • 30.4. Java – Клас Stack
  • 30.5. Java – Клас Dictionary
  • 30.6. Java – Клас Hashtable
  • 30.7. Java – Клас Properties
  • 31. Java – Колекції
  • 31.1. Java – Інтерфейс Collection
  • 31.2. Java – Інтерфейс List
  • 31.3. Java – Інтерфейс Set
  • 31.4. Java – Інтерфейс SortedSet
  • 31.5. Java – Інтерфейс Map
  • 31.6. Java – Інтерфейс Map.Entry
  • 31.7. Java – Інтерфейс SortedMap
  • 31.8. Java – Клас LinkedList
  • 31.9. Java – Клас ArrayList
  • 31.10. Java – Клас HashSet
  • 31.11. Java – Клас LinkedHashSet
  • 31.12. Java – Клас TreeSet
  • 31.13. Java – Клас HashMap
  • 31.14. Java – Клас TreeMap
  • 31.15. Java – Клас WeakHashMap
  • 31.16. Java – Клас LinkedHashMap
  • 31.17. Java – Клас IdentityHashMap
  • 31.18. Java – Алгоритми Collection
  • 31.19. Java – Iterator та ListIterator
  • 31.20. Java – Comparator
  • 32. Java – Дженерики
  • 33. Java – Серіалізація
  • 34. Java – Мережа
  • 34.1. Java – Обробка URL
  • 35. Java – Надсилання Email
  • 36. Java - Багатопоточність
  • 36.1. Java – Синхронізація потоків
  • 36.2. Java – Міжпоточний зв'язок
  • 36.3. Java – Взаємне блокування потоків
  • 36.4. Java – Керування потоками
  • 37. Java – Основи роботи з аплетами
  • 38. Java – Javadoc

Винятки в Java (Java Exception)

У повсякденному житті іноді виникають ситуації, що ми не планували.Наприклад, встаєш вранці на роботу, шукаєш зарядний пристрій до телефону, а його немає. Ідеш у ванну, щоб вмитися – відключили воду. Сів у машину – не заводиться. Але людина може легко справитися з такими непередбаченими ситуаціями. А як із ними справляються Java-програми, постараємося розібратися у цій статті.

Що таке винятки (exceptions java)

У світі програмування виникнення помилок та непередбачених ситуацій під час виконання програми називають винятком (exception). У програмі виключення можуть виникати внаслідок неправильних дій користувача, відсутності ресурсу на диску, або втрати з'єднання з сервером по мережі. Причинами винятків при виконанні програми можуть бути помилки програмування або неправильне використання API. На відміну від нашого світу, програма має чітко знати, як чинити в такій ситуації. Для цього Java передбачено механізм винятків.

Коротко про ключові слова try, catch, finally, throws

  • try – визначає блок коду, у якому може статися виняток;
  • catch - визначає блок коду, в якому відбувається обробка виключення;
  • finally – визначає блок коду, який є необов'язковим, але за його наявності виконується у разі незалежно від результатів виконання блоку try.
  • throw – використовується для порушення винятку;
  • throws - використовується в сигнатурі методів для попередження, що метод може викинути виняток.
//метод зчитує рядок із клавіатури public String input() throws MyException catch (IOException e) < System.out.println(e.getMessage()); // у блоці finally закриваємо потік читання >finally < // при закритті потоку теж можливе виняток, наприклад, якщо він був відкритий, тому “обертаємо” код у блок try try < reader.close(); // пишемо обробку виключення при закритті потоку читання catch (IOException e) < System.out.println(e.getMessage()); >> if (s.equals("")) < // ми вирішили, що порожній рядок може порушити надалі роботу нашої програми, наприклад, на результаті цього методу нам треба викликати метод substring(1,2), тому ми змушені перервати виконання програми з генерацією свого типу виключення MyException за допомогою throw throw new MyException("String can not be empty!"); >return s; >

Навіщо потрібен механізм винятків?

Подивимося на приклад із реального світу. Уявіть, що автомобільна дорога має ділянку з аварійним мостом з обмеженою вантажопідйомністю. Якщо по ньому поїде автомобіль із масою, що перевищує вантажопідйомність моста, він може зруйнуватися, і ситуація для водія може стати, м'яко кажучи, винятковою. Щоб цього не сталося, дорожня служба завчасно встановлює попереджувальні знаки на дорозі. Водій автомобіля, дивлячись на попереджувальний знак, порівнюватиме масу свого автомобіля з дозволеною для проїзду мостом. Якщо вона перевищує її – він поїде об'їзним шляхом. Завдяки діям дорожньої служби водії вантажного транспорту, по-перше, отримали можливість заздалегідь змінювати свій шлях, по-друге, попереджено про небезпеку на головному шляху, і, нарешті, попереджено про неможливість використання мосту за певних умов.

Можливість попередження та вирішення виняткової ситуації в програмі для її продовження – одна з причин використання винятків Java.Механізм винятків також дозволяє захистити написаний вами код (програмний інтерфейс) від неправильного використання користувачем за рахунок валідації (перевірки) вхідних даних. Давайте тепер на секунду побудемо дорожньою службою. По-перше, ви повинні знати місця, де автомобілістів можуть чекати на неприємності. По-друге, вам потрібно заготовити та встановити попереджувальні знаки. І, нарешті, вам потрібно передбачити об'їзні маршрути у разі небезпеки на основному шляху. У Java механізм виключень працює схожим чином. На стадії розробки програми ми «захищаємо» небезпечні ділянки коду щодо виключень за допомогою блоку try<>, передбачаємо «запасні» шляхи за допомогою блоку catch<>, у блоці finally<> ми пишемо код, який виконується у програмі за будь-якого результату. У випадках, коли ми не можемо передбачити «запасний шлях» або навмисно хочемо надати право вибору користувача, ми повинні принаймні попередити його про небезпеку. Чому? А ви тільки уявите обурення водія, який доїде до аварійного мосту, яким не можна проїхати, не зустрівши по дорозі жодного попереджувального знака! У програмуванні при написанні своїх класів та методів ми не завжди можемо передбачати контекст їх використання іншими розробниками у своїх програмах, тому не можемо передбачати на 100% правильний шлях для вирішення виняткової ситуації. У той же час правило хорошого тону — попередити користувачів нашого коду про можливість виняткової ситуації. Механізм виключень Java дозволяє нам зробити це за допомогою throws - по суті, оголошення загальної поведінки нашого методу, що полягає у викиданні виключення, і надаючи таким чином написання коду обробки виключення в Java користувачеві методу.

Попередження про «неприємності»

Коли ви не плануєте обробляти виняток у своєму методі, але хочете попередити користувачів методу про можливі виняткові ситуації, використовуйте ключове слово throws. Це ключове слово в сигнатурі методу означає, що за певних умов метод може викинути виняток. Таке попередження є частиною інтерфейсу методу та надає право користувачеві на власний варіант реалізації обробника виключення. Після throws ми вказуємо тип виключення, що викидається. Зазвичай, це спадкоємці класу Exception Java. Оскільки Java є об'єктно-орієнтованою мовою, всі винятки в Java є об'єктами.

Ієрархія винятків Java

  1. Ситуації, за яких відновлення подальшої нормальної роботи програми неможливе
  2. Відновлення можливе.

Створення винятку

При виконанні програми виняток генерується JVM або вручну за допомогою оператора throw . При цьому в пам'яті створюється об'єкт виключення та виконання основного коду програми переривається, а обробник винятків JVM намагається знайти спосіб обробити виняток.

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

Створення блоків коду, для яких ми передбачаємо обробку винятків Java, проводиться в програмі за допомогою конструкцій try<>catch, try<>catch<>finally, try<>finally<>.

При збудженні виключення в блоці try обробник виключення шукається в наступному блоці catch. Якщо в catch є обробник цього виду виключення - управління переходить до нього. Якщо ні, то JVM шукає обробник цього типу виключення в ланцюжку викликів методів доти, доки не буде знайдено відповідний catch. Після виконання блоку catch керування передається в необов'язковий блок finally. У випадку, якщо відповідний блок catch не знайдений, JVM зупиняє виконання програми і виводить стек викликів методів – stack trace , виконавши перед цим код блоку finally за його наявності. Приклад обробки винятків:

public class Print < void print(String s) < if (s == null) < throw new NullPointerException("Exception: s is null!"); >System.out.println("Inside method print: " + s); > public static void main(String[] args) < Print print = new Print(); Listlist=Arrays.asList("first step", null, "second step"); for (String s:list) <try <print.print(s); >catch (NullPointerException e) < System.out.println(e.getMessage()); System.out.println("Exception був processed. Program continues"); >finally < System.out.println("Inside block finally"); >System.out.println("Go program. "); System.out.println("-----------------"); > > >
Inside method print: перший Step Inside blosk finally Go program. ----------------- Exception: s is null! Висновок був processed. Program continues Inside blosk finally Go program. ----------------- Inside method print: second step Inside blosk finally Go program. -----------------

Блок звичайно зазвичай використовується для того, щоб закрити відкриті в блоці try потоки або звільнити ресурси. Однак при написанні програми не завжди можна встежити за закриттям усіх ресурсів. Для полегшення нашого життя розробники Java запропонували нам конструкцію try-with-resources, яка автоматично закриває ресурси, відкриті у блоці try. Наш перший приклад можна переписати так за допомогою try-with-resources:

public String input() throws MyException < String s = null; try(BufferedReader reader = новий BufferedReader(новий InputStreamReader(System.in)))< s = reader.readLine(); >catch (IOException e) < System.out.println(e.getMessage()); >if (s.equals("")) < throw new MyException ("String can not be empty!"); >return s; >

Завдяки можливостям Java, починаючи з версії 7, ми також можемо поєднувати перехоплення різнотипних винятків в одному блоці, роблячи код компактнішим і читабельнішим. Наприклад:

public String input() < String s = null; try (BufferedReader reader = новий BufferedReader(новий InputStreamReader(System.in))) < s = reader.readLine(); if (s.equals("")) < throw new MyException("String can not be empty!"); >> catch (IOException | MyException e) < System.out.println(e.getMessage()); >return s; >

Підсумки

Використання винятків у Java дозволяє підвищити стійкість до відмови програми за рахунок використання «запасних» шляхів, відокремити логіку основного коду від коду обробки виняткових ситуацій за рахунок використання блоків catch, а також дає нам можливість перекласти обробку виключень на користувача нашого коду за допомогою throws.

Схожі статті

  • Що таке Ципру
  • Що таке режим Atti для дронів Drones Cameras
  • Що таке Адамове яблуко у чоловіків
  • Що таке добори на міжкімнатні
  • Що таке дека на газонокосарці
  • Що таке код помилки 601
  • Що таке Жилка яловича
  • Що таке фонетична норма
  • Недавні статті

  • Як бродить зернова брага
  • Що робити якщо не засмагаєш на сонці чому засмага погано лягає на шкіру або перестає прилипати
  • Як швидко зняти гель лак без апарату
  • Як робиться Каті голови
  • Яка гребінець краще для об'єму
  • Чим роблять м'яку покрівлю
  • Чи можна залишати крем для обличчя на ніч
  • Де знаходиться датчик селектора
  • географія нашої діяльності
    вулиця Драгоманова, 27
    вул. Курчатова 1Б
    вул. Міцкевича 130
    вул. Лабунського, 1
    вул. Макарова-Пржевальського
    вул. Толстого 10
    вул. Грушевського 28
    вул. Перший промінь (Черняхівського)
    напишіть нам

    сообщение успешно отправлено
    x