java exceptions exception handling with examples
Цей відео-посібник із винятків Java пояснює все про обробку винятків у Java. Ви дізнаєтесь про ієрархію винятків, типи, методи класів тощо:
Коли ми виконуємо програми Java, нормальна поведінка або звичайний потік програми переривається через деякі несподівані події.
Наприклад, відкриваємо файл для зчитування даних. Коли виконується виклик Відкрити файл, ми виявляємо, що файл, який ми намагаємось відкрити, відсутній. Це призводить до переривання нормального потоку програми.
Ця подія, яка впливає або перериває звичайний потік програми, називається “ Виняток '.
=> Завітайте сюди, щоб вивчити серію навчальних програм Java для всіх.
Ось відео-посібник з обробки винятків Java:
Що ви дізнаєтесь:
Обробка винятків у Java
Коли в програмі виникає виняток, виконання програми припиняється. Оскільки це різке припинення, система генерує повідомлення та відображає його. Повідомлення, яке генерується системою, може бути загадковим, як деякі коди, або нечитабельним.
Таким чином, звичайний користувач повинен розуміти, чому програма різко припинила своє виконання, він / вона повинен знати причину. Повідомлення, створені системою в результаті виключення, можуть бути не корисними. У Java ми можемо обробити виняток і надати значущі повідомлення користувачеві про проблему.
Це обробка винятків, широко відома як “Обробка винятків” є однією з основних особливостей програмування на Java.
Причини виникнення винятку
Ми можемо мати різні причини, через які можуть статися винятки. Якщо це виняток, пов’язаний із введенням, то причиною може бути те, що вхідні дані є неправильними або нечитабельними.
Якщо ми отримаємо виняток для вводу-виводу файлів, то цілком можливо, що файли, з якими ми маємо справу, не існують. В інший час можуть бути помилки, такі як проблеми з мережею, принтер недоступний або функціонує тощо.
У програмі, крім винятків, ми також отримуємо помилки. Отже, щоб ефективно обробляти винятки, нам слід знати про різницю між помилкою та винятком.
Помилка вказує на більш серйозну проблему з програмою, і програма не повинна намагатися її виявити. Навпаки, винятком є умова, яку намагатиметься зловити будь-яка розумна програма.
Таким чином, помилка в програмі є більш серйозною, і програми можуть зірватися, коли вони зіткнуться з помилкою. З іншого боку, винятки трапляються в коді і можуть бути оброблені програмістом шляхом надання коригувальних дій.
Що таке обробка винятків?
Обробка винятків у Java - це механізм, за допомогою якого підтримується нормальний потік програми. Для цього ми використовуємо потужний механізм для обробки помилок або винятків під час виконання програми.
Послідовність коду, яка використовується для обробки винятків, називається «обробником винятків». Обробник винятків допитує контекст у момент, коли сталося виняток. Це означає, що він зчитує значення змінних, які були в області дії під час виникнення винятку, а потім відновлює програму Java, щоб продовжувати нормальний потік.
формат тестування при тестуванні програмного забезпечення
Переваги обробки винятків
Основною перевагою обробки винятків є те, що вона підтримує нормальний потік програми, незважаючи на появу винятку. Коли виникає виняток, програма, як правило, різко припиняється.
Наявність обробника винятків у програмі не призведе до різкого завершення роботи програми. Натомість обробник винятків гарантує, що всі оператори в програмі виконуються нормально, і потік програми не різко порушується.
Ієрархія винятків на Java
На діаграмі нижче показано ієрархію винятків у Java. Клас java.lang.Throwable (нащадок класу Object) є кореневим класом Java Exception. Класи Exception та Error є похідними від цього класу.
Клас винятків є базовим класом для всіх інших винятків.
Нижче наведено ієрархію класу винятків у Java, яка перелічить усі основні винятки, про які повинен бути відомий програміст Java.
Клас винятків на Java
Як видно на діаграмі ієрархії, клас Throwable має два прямих підкласи, тобто Exception та Error. Винятки, що виникають із зовнішнього джерела, описані в класі Exception.
Клас Exception оголошує конструктори такими ж, як клас Throwable, і виклик кожного конструктора також викликає його аналог Throwable. Клас винятків не оголошує свої методи, він успадковує методи класу Throwable.
Конструктори та методи, які використовує клас Exception, представлені нижче.
Конструктори
Будівельник Опис public Exception () Конструктор за замовчуванням, який створює новий виняток із повідомленням як null. public Exception (рядкове повідомлення) Конструктор для побудови нового винятку з даним повідомленням. У цьому випадку причина не ініціалізується, і наступний виклик Throwable.initCause (java.lang.Throwable) може бути використаний для ініціалізації причини. загальнодоступне виняток (повідомлення рядка, причина, яку можна викинути) Побудовує новий виняток за допомогою заданого повідомлення та причини. публічне виняток (причина, яку можна викинути) Побудовує новий виняток із заданою причиною та повідомленням, заданим (cause == null? Null: cause.toString ()) (яке зазвичай містить повідомлення про клас та подробиці причини). захищений виняток (рядкове повідомлення, причина, що викидається, логічне включенняSuppression, логічне writableStackTrace) Створює новий виняток із заданим повідомленням, причиною, придушенням (увімкненим або вимкненим) та записаним трасуванням стека (увімкненим або вимкненим).
Методи
Метод-прототип | Опис |
---|---|
public String getMessage () | Отримайте детальне повідомлення про виняток, що стався. |
public Throwable getCause () | Отримайте причину винятку, представленого об’єктом, який можна кинути |
public String toString () | Об’єднує ім’я класу з результатом getMessage () і повертає результуючий рядок. |
public void printStackTrace () | Друкує результат toString () та вміст трасування стека у вихідний потік помилок System.err. |
відкритий StackTraceElement () getStackTrace () | Отримати кожен елемент у трасі стека у вигляді масиву. |
public Throwable fillInStackTrace () | Заповніть трасування стека поточним трасуванням стека. |
Приклад винятку
Далі ми представляємо програму Java для демонстрації базового прикладу винятків. Тут ми надаємо рядкову змінну, ініціалізовану до нульового значення. Коли ми намагаємось надрукувати цю змінну, виникає виняток, оскільки значення рядка не може бути нульовим.
class Main { public static void main(String args()){ //declare a String variable and initialize it to null String myStr = null; //print the string System.out.println(myStr.length()); } }
Вихідні дані
Типи винятків у Java
Java підтримує три типи винятків:
- Позначений виняток
- Невизначений виняток
- Помилка
У цьому розділі ми обговоримо всі вищезазначені три типи.
# 1) Перевірений виняток
Деякі винятки перевіряються під час компіляції, коли компілюється код. Це «Перевірені винятки». Програма Java видає помилку компіляції, коли виявляє, що код всередині програми схильний до помилок.
Ми можемо подбати про помилки компіляції, викинуті перевіреним винятком, обробляючи винятки, або вкладаючи код у блок try-catch, або використовуючи ключове слово throws.
В ієрархії винятків клас, який безпосередньо успадковує клас Throwable, такий як IOException, ClassNotFoundException тощо, є виключенням, крім класів RuntimeException та Error. Це неперевірені винятки.
Наступна програма Java демонструє перевірені винятки, FileNotFoundException та IOException. У цій програмі ми намагаємось відкрити неіснуючий файл і прочитати з нього.
Оскільки файл не існує, метод відкритого файлу кидає FileNotFoundException. Далі, коли ми намагаємося прочитати вміст файлу і закрити файл, виклики методів кидають IOException.
import java.io.*; class Main { public static void main(String args()) { FileInputStream fis = null; //Open a file fis = new FileInputStream('C:/myfile.txt'); int k; //read contents of the file while(( k = fis.read() ) != -1) { System.out.print((char)k); } //close the file fis.close(); } }
Вихідні дані
У наведеному вище виведенні, оскільки обробник винятків відсутній, ми отримуємо помилки компіляції для перевірених винятків.
А тепер давайте наведемо застереження для цієї програми. Оскільки батьківським файлом FileNotFoundException є IOException, ми просто вкажемо IOException після речення throws.
import java.io.*; class Main { public static void main(String args()) throws IOException { FileInputStream fis = null; //Open a file fis = new FileInputStream('C:/myfile.txt'); int k; //read contents of the file while(( k = fis.read() ) != -1) { System.out.print((char)k); } //close the file fis.close(); } }
Вихідні дані
Як видно з результату, коли ми обробляємо виняток, він забезпечує більш значущий результат замість помилок компіляції.
# 2) Невизначений виняток
Невизначені винятки - це винятки, які перевіряються під час виконання. Отже, незважаючи на винятки, компіляція програм буде успішною. Більшість неперевірених винятків виникають через погані дані, що використовуються в програмі.
Класи, які успадковують “RuntimeException”, є неперевіреними винятками. Винятки, такі як ArrayIndexOutofBounds Exception, ArithmeticException, NullPOinterException тощо, є прикладами неперевірених винятків.
Наступна програма демонструє невиконане виключення під час виконання, яке викликане діленням числа на нуль.
class Main { public static void main(String args()) { int num1=10; int num2=0; //divide both numbers and print the result int result=num1/num2; System.out.println(result); } }
Вихідні дані
Ми бачимо, що програма успішно компілюється, а потім ArithmeticException викидається під час виконання.
Приклади неперевіреного винятку:
- ArrayIndexOutOfBoundsException
- NullPointerException
- IllegalArgumentException
- NumberFormatException
Окрім вищезазначених двох винятків, є ще кілька перевірених винятків, включаючи:
- SQLException
- InvocationTargetExecption
# 3) Помилка
Помилка - це, як правило, незворотна та невиправна ситуація в програмі, і коли виникає помилка, програми аварійно завершують роботу. Деякі з прикладів помилок у програмі: OutOfMemoryError, AssertionError та VirtualMachineError тощо.
Клас помилок успадковується від класу Throwable. Помилка описує ситуацію, з якою неможливо впоратись, що спричиняє збій програми.
Давайте обговоримо помилку OutOfMemory у цьому розділі як приклад помилки.
Ми знаємо, що всі об’єкти в Java виділяються за допомогою нового оператора і зберігаються в купі. Коли купа втрачає пам’ять, віртуальна машина Java (JVM) не може розподілити об’єкт. У той же час збирач сміття не може звільнити жодної пам’яті. Ця ситуація призводить до помилки OutOfMemory.
Помилка OutOfMemoryError у Java виглядатиме, як показано нижче:
'exception in thread 'main' java.lang.outofmemoryerror: java heap space'
Наявність OutOfMemoryError у програмі означає, що обробляється занадто багато даних, або об'єкти утримуються занадто довго. Іноді це також може бути стороння бібліотека, яка використовує пам’ять.
Причини помилки OutOfMemoryError
# 1) Простір купи Java
Якщо у додатку забагато фіналізаторів, то об’єкти класу, що мають метод Finalize, не збираються відразу збирачем сміття, а ставляться в чергу на доопрацювання пізніше. Іноді доопрацювання не встигає за часом, і пам'ять купи заповнюється, що призводить до OutOfMemoryError.
Ще однією причиною OutOfMemoryError є те, що вказаний розмір купи може бути недостатнім для програми.
Наступний код демонструє OutOfMemoryError, яка може статися через величезний розмір даних, заявлений для масиву.
import java.util.*; public class Main { static List list = new ArrayList(); public static void main(String args()) throws Exception { Integer() array = new Integer(100000 * 100000); } }
Вихідні дані
# 2) Пермгенський простір
Область постійного покоління в пам'яті також може бути вичерпана і може спричинити помилку OutOfMemory.
Розмір регіону PermGen встановлюється під час запуску JVM. Якщо користувач не встановлює розмір, використовується розмір за замовчуванням, який залежить від платформи.
Хоча вищезазначені дві зазвичай є основними причинами виникнення OutOfMemoryError, можуть бути й інші причини, такі як розмір масиву, що перевищує межу віртуальної машини тощо.
Список винятків у Java
Нижче наведено список основних винятків, які трапляються на Java. Для деяких з цих винятків ми навели приклади програмування. Зверніть увагу, що це вбудовані винятки, що підтримуються Java.
# 1) Арифметичне виняток: Арифметичні відхилення, такі як ділення на нуль, призводять до ArithmeticException.
Наведена нижче програма демонструє появу ArithmeticException.
class Main { public static void main(String args()) { try { //define two numbers int num1 = 100, num2 = 0; int result = num1 / num2; // divide by zero //print the result System.out.println('Result = ' + result); } catch (ArithmeticException e) { System.out.println('ArithmeticException:Division by Zero'); } } }
Вихідні дані
# 2) ArrayIndexOutOfBoundsException: ArrayIndexOutOfBoundsException викидається, коли доступ до елемента масиву здійснюється за допомогою незаконного індексу. Використовуваний індекс перевищує розмір масиву або є від’ємним.
# 3) ClassNotFoundException: Якщо визначення класу не знайдено, піднімається ClassNotFoundException.
# 4) FileNotFoundException: FileNotFoundException надається, коли файл не існує або не відкривається.
# 5) IOException: IOException видається, коли операція введення-виведення не вдається або переривається.
# 6) InterruptedException: Всякий раз, коли потік виконує обробку, сплячий режим або очікування, він переривається, кидаючи InterruptedException.
# 7) NoSuchFieldException: Якщо клас не містить зазначеного поля або змінної, тоді він видає NoSuchFieldException.
# 8) NoSuchMethodException: Коли метод, до якого здійснюється доступ, не знайдено, піднімається NoSuchMethodException.
# 9) NullPointerException: NullPointerException піднімається, коли посилається на нульовий об'єкт. Це найважливіший і найпоширеніший виняток у Java.
# 10) NumberFormatException: Цей виняток виникає, коли метод не може перетворити рядок у числовий формат.
# 11) Виняток виконання: Будь-який виняток, який виникає під час виконання, є RuntimeException.
# 12) StringIndexOutOfBoundsException: StringIndexOutOfBoundsException видається класом String і вказує, що індекс перевищує розмір об'єкта String або є від'ємним.
# 13) EOFException: EOFException є частиною пакету java.io і викидається, коли досягається кінець файлу і файл читається.
# 14) IllegalArgumentException: IllegalArgumentException видається, коли в метод передаються нелегальні або недійсні аргументи. Наприклад, неправильний формат даних, нульове значення, коли потрібно ненульове значення або аргументи поза діапазоном.
Наведена нижче програма Java демонструє IllegalArgumentException.
public class Main { int m; public static void setMarks(int marks) public static void main(String() args) { setMarks(45); setMarks(101); } }
Вихідні дані
У наведеній вище програмі IllegalArgumentException викидається під час другого виклику функції setMarks, де ми вводимо знаки, що виходять за межі діапазону (> 45).
# 15) InputMismatchException: InputMismatchException видається, коли прочитане введення не відповідає вказаному шаблону. Наприклад, якщо програма очікує ціле число і зчитує float, тоді InputMismatchException піднімається.
# 16) NoSuchElementException: NoSuchElementException викидається, коли наступний доступний елемент не існує.
Наприклад, в Enumeration метод nextElement () використовується для доступу до наступного елемента в переліку. Якщо елемент не існує, викидається NoSuchElementException. Здебільшого колекції Java створюють цей виняток.
як відкрити .bin файли -
Наведена нижче програма демонструє це.
import java.util.*; public class Main { public static void main(String() args) { Set hash_Set = new HashSet(); //create an empty hashSet. //This throws NoSuchElementException since hashSet is empty hash_Set.iterator().next(); } }
Вихідні дані
# 17) ConcurrentModificationException: ConcurrentModificationException зазвичай створюється класами Collection. Цей виняток виникає, коли об'єкти намагаються одночасно модифікувати ресурс.
Наприклад, потік не може змінювати колекцію, коли інший потік отримує до неї доступ. Якщо ми дозволимо два потоки, то ці два одночасно матимуть доступ до колекції, і будуть невідповідності.
Наступний приклад демонструє ConcurrentModificationException.
import java.awt.List; import java.util.*; public class Main { public static void main(String() args) { ArrayList A_list = new ArrayList<>(); //add elements to the ArrayList A_list.add(10); A_list.add(20); A_list.add(30); Iterator it = A_list.iterator(); while (it.hasNext()) { Integer value = it.next(); System.out.println('ArrayList Value:' + value); if (value.equals(30)) A_list.remove(value); } } }
Вихідні дані
У наведеній вище програмі, поки друкується ArrayList, ми намагаємось одночасно видалити елемент. Це одночасний доступ, і таким чином створюється виняток.
Спеціальні винятки в Java
Наразі ми обговорили всі винятки, які вбудовані або надані мовою Java. Окрім цих винятків, ми можемо також визначити власні винятки. Вони називаються спеціальними винятками або визначеними користувачем винятками.
Використовуючи власні винятки, ми можемо визначити наші винятки відповідно до наших потреб.
Наступний приклад показує спеціальний виняток, який ми визначили для цілого значення.
//custom exception definition class InvalidValueException extends Exception{ InvalidValueException(String s){ super(s); } } class Main{ static void validate(int int_val)throws InvalidValueException{ if(int_val<10) //value is valid if> 10 else throw exception throw new InvalidValueException('Invalid value'); else System.out.println('This is valid integer'); } public static void main(String args()){ try{ validate(9); }catch(Exception m){System.out.println('Exception occured: '+m);} System.out.println('Code after Exception'); } }
Вихідні дані
Часті запитання
Q # 1) Що ви маєте на увазі під винятком?
Відповідь: Подія, яка відбувається під час виконання програми та порушує нормальний потік виконання програми, називається винятком. Виняток є небажаним і несподіваним і може виникнути через зовнішні фактори або помилки програмування.
Q # 2) У чому різниця між помилкою та винятком?
Відповідь: Виняток становлять події, які порушують нормальний потік програми. Ми можемо обробляти винятки в нашій програмі і продовжувати програму в звичайному режимі. Помилка - це непоправна подія, яку неможливо обробити, і вона припиняє роботу програми.
Q # 3) Що ви маєте на увазі під обробкою винятків?
Відповідь: Процес визначення послідовності кроків у програмі для обробки винятків називається обробкою винятків. Забезпечуючи обробники винятків у програмі, ми можемо забезпечити нормальний потік програми.
Q # 4) Які переваги обробки винятків у Java?
Відповідь: Використовуючи обробку винятків, ми можемо підтримувати нормальний потік виконання програми. Ми також можемо поширювати помилки в стеці викликів, коли надаємо обробники винятків.
Q # 5) Яка користь від обробки винятків?
Відповідь: Не припинення звичайного потоку виконання програми є основним використанням обробників винятків у програмі. Без обробників винятків програма буде завершена, і звичайний потік виконання буде перерваний у разі виникнення винятку.
За винятком належного оброблення програми, вона може продовжувати нормальне виконання, навіть коли виникає виняток.
Додаткові приклади про винятки
Винятком є подія, яка відбувається під час запуску програми і порушує її виконання. Через що програмний продукт різко закінчиться.
Коли виникає цей виняток, Java створює об'єкт із повідомленням про помилку та інформацією про клас. Це об’єкт виключення.
Навіщо нам потрібен виняток у Java?
Клас ExcepDemo без винятку:
public class ExcepDemo { public static void main(String() args) { int i=5; int j=0; System.out.println(i/j); System.out.println('statement after division'); } }
ВИХІД:
Клас ExcepDemo з обробкою винятків:
public class ExcepDemo { public static void main(String() args) { // TODO Auto-generated method stub int i=5; int j=0; try { System.out.println(i/j); } catch(ArithmeticException ae) { System.out.println('wrong input'); } System.out.println('statement after division'); } }
ВИХІД:
Спробуйте, зловіть і нарешті заблокуйте:
- Виняток обробляється блоком try, catch.
- Твердження, які можуть призвести до винятків, записані всередині блоку try.
- Коли виникає виняток, оператори всередині блоку catch будуть виконані. Якщо виняток не відбувається, блок catch не буде виконаний.
- Незалежно від того, що сталося або не сталося винятку, остаточний блок буде виконаний.
Типи винятків
Невизначений виняток:
Оскільки неперевірених винятків можна уникнути за допомогою належного програмування ( Наприклад null pointer Exception, Arithmetic Exception) не перевірятиме компілятор. Невизначений виняток буде видано під час виконання.
Позначений виняток:
- Перевірений виняток перевірятиме компілятор та його обов’язковість для видалення або обробки винятку.
- Цей виняток використовується для відокремлення коду обробки помилок від звичайного коду.
- Всі перевірені винятки згруповані, і це корисно для диференціації проблем.
Приклад: java.io
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; public class DemoExpChecked { public static void main(String() args) { try { File file=new File('input.txt'); BufferedReader br = new BufferedReader(new FileReader(file)) ; String content; while ((content=br.readLine())!=null) { System.out.println(content); } br.close(); } catch(IOException e) { e.printStackTrace(); } } }
Помилки
Помилка може статися через логічні помилки програми або будь-яку пам’ять, пов’язану з проблемою JVM.
Приклад: Помилка поза обмеженою помилкою або помилка переповнення стека.
Кидай і кидає
Ключове слово “Throw” використовується для видалення винятку, тоді як ключове слово “throws” використовується для оголошення виключення.
Приклад програми:
public class Demothrow { String content ; public void driving(String c) { this.content=c; if (content.isEmpty()) { throw new NullPointerException('content is empty'); } else { System.out.println('content=='+content); } } public static void main(String() args) { Demothrow dt=new Demothrow(); dt.driving(''); } }
Приклад програми для метання:
Кидки використовуються для надання інформації про те, що цей метод викликає саме цей виняток. Коли ви викликаєте цей конкретний метод, вам потрібно обробити цей виняток.
public class DemoThrows { int i=2,j=0; public void checkmethod () throws ArithmeticException{ System.out.println(i/j); } public static void main(String() args) { DemoThrows d =new DemoThrows(); try { d.checkmethod(); } catch (ArithmeticException ae) { ae.printStackTrace(); } } }
Ключові моменти, на які слід звернути увагу:
- Виняток становлять ненормальні події, які сталися під час виконання програми, і це вплине на потік виконання.
- Помилка відрізняється від винятків. Приклад помилок: Пам'ять помилково.
- Перевірені винятки перевіряються під час компіляції, і обов’язковою є робота з цим перевіреним винятком.
- Невизначений виняток виникає під час виконання.
Висновок
Цей підручник з обробки винятків у Java представив визначення винятків, обробку винятків та ієрархію винятків у Java. Ми також обговорили клас винятків на Java, який надає різні конструктори та методи доступу до винятків.
Ми вивчили список загальних винятків, які трапляються на Java, і побачили приклади програмування для основного винятку. Ми також обговорили основні помилки, які виникають у програмі Java, а також типи винятків та спеціальні винятки.
=> Перевірте ВСІ підручники Java тут.
Рекомендована література
- 10 найкращих винятків селену та способи їх усунення (точний код)
- Обробка винятків JDBC - Як обробляти винятки SQL
- Як обробляти винятки у скриптах Groovy SoapUI - Підручник No11 з SoapUI
- Рядок Java із підручником для буфера рядків та побудови рядків
- Розгортання Java: створення та виконання файлу Java JAR
- Потоки Java з методами та життєвим циклом
- Віртуальна машина Java: як JVM допомагає у запуску програми Java
- Модифікатори доступу в Java - Підручник із прикладами