Обробка винятків в Java є одним із ефективних засобів обробки помилок виконання, щоб можна було зберегти регулярний потік програми. Обробка винятків Java — це механізм для обробки помилок виконання, таких як ClassNotFoundException, IOException, SQLException, RemoteException тощо.
Що таке винятки Java?
У Java, виняток це небажана або неочікувана подія, яка відбувається під час виконання програми, тобто під час виконання, що порушує нормальний потік інструкцій програми. Винятки можуть бути переловлені та оброблені програмою. Коли в методі виникає виняток, він створює об’єкт. Цей об’єкт називається об’єктом винятку. Він містить інформацію про виняткову ситуацію, таку як назва й опис виняткової ситуації, а також стан програми, коли сталася виняткова ситуація.
Основні причини виникнення винятку
- Недійсний введений користувачем
- Збій пристрою
- Втрата підключення до мережі
- Фізичні обмеження (пам'ять поза диском)
- Помилки коду
- Відкриття недоступного файлу
Помилки представляють невиправні умови, такі як нестача пам’яті віртуальної машини Java (JVM), витоки пам’яті, помилки переповнення стеку, несумісність бібліотек, нескінченна рекурсія тощо. Помилки зазвичай знаходяться поза контролем програміста, і ми не повинні намагатися обробляти помилки.
Різниця між помилкою та винятком
Давайте обговоримо найважливішу частину, яка є відмінності між помилкою та винятком це так:
- Помилка: Помилка вказує на серйозну проблему, яку розумна програма не повинна намагатися виявити.
- Виняток: Виняток вказує на умови, які розумна програма може спробувати вловити.
Ієрархія винятків
Усі типи винятків і помилок є підкласами класу Кидковий , який є базовим класом ієрархії. Одне відділення очолює Виняток . Цей клас використовується для виняткових умов, які програми користувача повинні вловлювати. NullPointerException є прикладом такого винятку. Інша гілка, Помилка використовується системою виконання Java( JVM ), щоб вказати помилки, пов’язані з самим середовищем виконання (JRE). StackOverflowError є прикладом такої помилки.

Ієрархія винятків Java
Типи винятків
Java визначає кілька типів винятків, які стосуються різних бібліотек класів. Java також дозволяє користувачам визначати власні винятки.

Винятки можна класифікувати двома способами:
- Вбудовані винятки
- Перевірений виняток
- Неперевірений виняток
- Винятки, визначені користувачем
Давайте обговоримо вказаний вище виняток, який виглядає наступним чином:
1. Вбудовані винятки
Вбудовані винятки — це винятки, доступні в бібліотеках Java. Ці винятки підходять для пояснення певних помилкових ситуацій.
- Перевірені винятки: Перевірені винятки називаються винятками під час компіляції, оскільки ці винятки перевіряються компілятором під час компіляції.
- Неперевірені винятки: Неперевірені винятки прямо протилежні перевіреним виняткам. Компілятор не перевірятиме ці винятки під час компіляції. Простіше кажучи, якщо програма викидає неперевірений виняток, і навіть якщо ми його не обробили або не оголосили, програма не видасть помилки компіляції.
Примітка: Перевірені та неперевірені винятки див Перевірені та неперевірені винятки
2. Винятки, визначені користувачем:
Іноді вбудовані винятки в Java не можуть описати певну ситуацію. У таких випадках користувачі також можуть створювати винятки, які називаються «визначеними користувачем винятками».
The переваги обробки винятків у Java такі:
- Забезпечення завершення виконання програми
- Легка ідентифікація програмного коду та коду обробки помилок
- Розповсюдження помилок
- Змістовне повідомлення про помилки
- Визначення типів помилок
Способи друку інформації про винятки:
1. printStackTrace()
Цей метод друкує інформацію про винятки у форматі Ім’я винятку: опис винятку, трасування стека.
приклад:
Java
livecricket.is
//program to print the exception information using printStackTrace() method> > import> java.io.*;> > class> GFG {> > public> static> void> main (String[] args) {> > int> a=> 5> ;> > int> b=> 0> ;> > try> {> > System.out.println(a/b);> > }> > catch> (ArithmeticException e){> > e.printStackTrace();> > }> > }> }> |
>
>
Вихід
java.lang.ArithmeticException: / by zero at GFG.main(File.java:10)>
2. toString()
Метод toString() друкує інформацію про винятки у форматі Ім’я винятку: опис винятку.
приклад:
Java
//program to print the exception information using toString() method> > import> java.io.*;> > class> GFG1 {> > public> static> void> main (String[] args) {> > int> a=> 5> ;> > int> b=> 0> ;> > try> {> > System.out.println(a/b);> > }> > catch> (ArithmeticException e){> > System.out.println(e.toString());> > }> > }> }> |
>
>
Вихід
java.lang.ArithmeticException: / by zero>
3. getMessage()
Метод getMessage() друкує лише опис винятку.
приклад:
Java
//program to print the exception information using getMessage() method> > import> java.io.*;> > class> GFG1 {> > public> static> void> main (String[] args) {> > int> a=> 5> ;> > int> b=> 0> ;> > try> {> > System.out.println(a/b);> > }> > catch> (ArithmeticException e){> > System.out.println(e.getMessage());> > }> > }> }> |
>
>
Вихід
/ by zero>
Як JVM обробляє винятки?
Обробка винятків за замовчуванням: Щоразу, коли всередині методу, якщо сталася виняткова ситуація, метод створює об’єкт, відомий як об’єкт винятку, і передає його системі виконання (JVM). Об’єкт винятку містить ім’я та опис винятку та поточний стан програми, у якій стався виняток. Створення об’єкта винятку та його обробка в системі виконання називається створенням винятку. Може бути список методів, які були викликані, щоб отримати доступ до методу, де сталася виняткова ситуація. Цей упорядкований список методів називається Стек викликів . Тепер відбудеться наступна процедура.
- Система виконання виконує пошук у стеку викликів, щоб знайти метод, який містить блок коду, який може обробити виняткову ситуацію, що сталася. Блок коду називається an Обробник винятків .
- Виконувана система починає пошук із методу, в якому сталася виняток, і продовжує стек викликів у зворотному порядку виклику методів.
- Якщо він знаходить відповідний обробник, він передає йому виниклий виняток. Відповідний обробник означає, що тип створеного об’єкта винятку відповідає типу об’єкта винятку, який він може обробити.
- Якщо система виконання шукає всі методи в стеку викликів і не може знайти відповідний обробник, тоді система виконання передає Exception Object до обробник винятків за замовчуванням , який є частиною системи виконання. Цей обробник друкує інформацію про винятки в наступному форматі та завершує програму ненормально .
Exception in thread 'xxx' Name of Exception : Description ... ...... .. // Call Stack>
Подивіться на діаграму нижче, щоб зрозуміти потік стека викликів.

Ілюстрація:
Java
регістр java switch
// Java Program to Demonstrate How Exception Is Thrown> > // Class> // ThrowsExecp> class> GFG {> > > // Main driver method> > public> static> void> main(String args[])> > {> > // Taking an empty string> > String str => null> ;> > // Getting length of a string> > System.out.println(str.length());> > }> }> |
>
>
Вихід

Давайте подивимося приклад, який ілюструє, як система виконання шукає відповідний код обробки винятків у стеку викликів.
приклад:
Java
// Java Program to Demonstrate Exception is Thrown> // How the runTime System Searches Call-Stack> // to Find Appropriate Exception Handler> > // Class> // ExceptionThrown> class> GFG {> > > // Method 1> > // It throws the Exception(ArithmeticException).> > // Appropriate Exception handler is not found> > // within this method.> > static> int> divideByZero(> int> a,> int> b)> > {> > > // this statement will cause ArithmeticException> > // (/by zero)> > int> i = a / b;> > > return> i;> > }> > > // The runTime System searches the appropriate> > // Exception handler in method also but couldn't have> > // found. So looking forward on the call stack> > static> int> computeDivision(> int> a,> int> b)> > {> > > int> res => 0> ;> > > // Try block to check for exceptions> > try> {> > > res = divideByZero(a, b);> > }> > > // Catch block to handle NumberFormatException> > // exception Doesn't matches with> > // ArithmeticException> > catch> (NumberFormatException ex) {> > // Display message when exception occurs> > System.out.println(> > 'NumberFormatException is occurred'> );> > }> > return> res;> > }> > > // Method 2> > // Found appropriate Exception handler.> > // i.e. matching catch block.> > public> static> void> main(String args[])> > {> > > int> a => 1> ;> > int> b => 0> ;> > > // Try block to check for exceptions> > try> {> > int> i = computeDivision(a, b);> > }> > > // Catch block to handle ArithmeticException> > // exceptions> > catch> (ArithmeticException ex) {> > > // getMessage() will print description> > // of exception(here / by zero)> > System.out.println(ex.getMessage());> > }> > }> }> |
>
>Вихід
/ by zero>
Як програміст справляється з винятковою ситуацією?
Індивідуальна обробка винятків: Обробкою винятків Java керують за допомогою п’яти ключових слів: спробувати , виловити , кинути , кидки , і нарешті . Коротко, ось як вони працюють. Оператори програми, які, на вашу думку, можуть викликати винятки, містяться в блоці try. Якщо в блоці try виникає виняток, він викидається. Ваш код може перехопити цей виняток (за допомогою блоку catch) і обробити його в якийсь раціональний спосіб. Винятки, створені системою, автоматично створюються системою виконання Java. Щоб вручну створити виняток, використовуйте ключове слово throw. Будь-який виняток, який викидається з методу, повинен бути визначений як такий у пропозиції throws. Будь-який код, який обов’язково повинен бути виконаний після завершення блоку try, поміщається в блок finally.
Порада: Треба пройти керування потоком у блоку try catch finally для кращого розуміння.
Потреба в пункті try-catch (спеціальна обробка винятків)
Розгляньте наведену нижче програму, щоб краще зрозуміти речення try-catch.
приклад:
Java
// Java Program to Demonstrate> // Need of try-catch Clause> > // Class> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Taking an array of size 4> > int> [] arr => new> int> [> 4> ];> > > // Now this statement will cause an exception> > int> i = arr[> 4> ];> > > // This statement will never execute> > // as above we caught with an exception> > System.out.println(> 'Hi, I want to execute'> );> > }> }> |
цифри для алфавіту
>
>
Вихід

Пояснення виходу: У наведеному вище прикладі масив визначено розміром, тобто ви можете отримати доступ до елементів лише з індексом 0 до 3. Але ви намагаєтесь отримати доступ до елементів з індексом 4 (помилково), тому видає виняток. У цьому випадку JVM завершує роботу програми ненормально . Інструкція System.out.println(Привіт, я хочу виконати); ніколи не виконає. Щоб його виконати, ми повинні обробити виняток за допомогою try-catch. Отже, щоб продовжити нормальний потік програми, нам потрібна пропозиція try-catch.
Як використовувати речення Try-catch?
try { // block of code to monitor for errors // the code you think can raise an exception } catch (ExceptionType1 exOb) { // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) { // exception handler for ExceptionType2 } // optional finally { // block of code to be executed after try block ends }>
Необхідно запам’ятати деякі ключові моменти, а саме:
- У методі може бути більше одного оператора, який може викликати виняток, тому помістіть усі ці оператори в свої власні спробувати заблокувати та надати окремий обробник винятків у своєму власному виловити блок для кожного з них.
- Якщо в межах спробувати цей виняток обробляється пов’язаним із ним обробником винятків. Щоб асоціювати обробник винятків, ми повинні поставити a виловити блокувати після нього. Може бути більше одного обробника винятків. Кожен виловити block — це обробник винятків, який обробляє виняток типу, зазначеного його аргументом. Аргумент ExceptionType оголошує тип винятку, який він може обробити, і має бути назвою класу, який успадковує від Кидковий клас.
- Для кожного блоку try може бути нуль або більше блоків catch, але тільки один завершальний блок.
- Блок finally необов’язковий. Він завжди виконується незалежно від того, чи сталася виняток у блоці try, чи ні. Якщо виникне виняток, воно буде виконано пізніше спробуйте зловити блоки. І якщо виключення не відбувається, то воно буде виконано після спробувати блокувати. Блок finally у Java використовується для розміщення важливих кодів, таких як код очищення, наприклад, закриття файлу або закриття з’єднання.
- Якщо ми напишемо System.exit у блоці try, то блок finally не буде виконано.
Короткий зміст зображено за допомогою візуальної допомоги нижче таким чином:

Пов'язані статті:
- Типи винятків у Java
- Перевірені та неперевірені винятки
- Throw-Throws в Java
Схожі курси
Java Programming Foundation – курс для самостійного навчання
Знайдіть правильний курс для себе, щоб почати вивчати Java Programming Foundation від експертів галузі з багаторічним досвідом. Це Java Programming Foundation – курс для самостійного навчання охоплює основи Мова програмування Java, типи даних, оператори та керування потоком, цикли, рядки , і багато іншого. Більше чекати! Почніть вивчати JAVA зараз і станьте повноцінним Java-інженером!