try catch finally
У цьому підручнику ми обговоримо різні ключові слова, що використовуються в Java для обробки винятків, такі як Try, Catch, нарешті, Throw і Throw з прикладами:
У наших попередніх навчальних посібниках ми бачили основи обробки винятків у Java, а також різні винятки, що підтримуються класом Java Exception. Ми також детально обговорили NullPointerException.
Ми можемо включити винятки в нашу програму, використовуючи певні ключові слова, які надаються на Java. Ці ключові слова визначають різні блоки коду, що полегшують визначення та обробку винятків.
=> Завітайте сюди, щоб ознайомитись із ексклюзивною серією навчальних посібників Java.
Що ви дізнаєтесь:
Спробуйте, зловіть, нарешті, на Java
Наведені нижче ключові слова використовуються в Java для обробки винятків.
- Спробуйте
- Улов
- Нарешті
- Кинути
- Кидки
У наступній таблиці коротко описані ці ключові слова.
Ключове слово | Опис |
---|---|
Спробуйте | Ми вказуємо блок коду, який може спричинити виняток, у спеціальному блоці із ключовим словом “Спробувати”. |
Улов | Коли виникає виняток, його потрібно вловити програмою. Це робиться за допомогою ключового слова “catch”. Отже, блок catch слід за блоком try, який викликає виняток. Ключове слово catch завжди слід використовувати із спробою. |
Нарешті | Іноді в нашій програмі є важливий код, який потрібно виконувати, незалежно від того, чи було вилучено виняток. Цей код розміщується в спеціальному блоці, починаючи з ключового слова “Нарешті”. Блок нарешті слідує за блоком Try-catch. |
Кинути | Ключове слово 'кидати' використовується для явного викиду виключення. |
Кидки | Ключове слово “Кидає” не створює виключення, але використовується для оголошення виключень. Це ключове слово використовується для позначення того, що у програмі чи методі може статися виняток. |
У цьому підручнику ми детально обговоримо всі вищезазначені ключові слова разом із прикладами програмування.
Спробуйте заблокувати в Java
Кожного разу, коли ми пишемо програму, може існувати код, який, як ми підозрюємо, може спричинити виняток. Наприклад, ми можемо підозрювати, що в коді може бути операція „ділення на нуль”, яка призведе до винятку.
Цей код, який може спричинити виняток, укладений у блок із ключовим словом “try”. Отже, блок try містить код або набір операторів, які можуть викликати виняток.
Загальний синтаксис блоку try такий:
try{ //set of statements that can raise exception }
Отже, якщо програміст вважає, що певні твердження викликатимуть винятки, тоді вкладіть ці твердження в блок спроби. Зверніть увагу, що коли виняток відбувається у певному операторі в блоці try, тоді решта коду не виконується.
Коли в блоці try виникає виняток у певному операторі, тоді керування виходить і програма різко припиняється. Щоб запобігти цьому різкому припиненню програми, нам слід “обробити” цей виняток. Ця обробка здійснюється за допомогою ключового слова “catch”. Отже, у блоці try завжди є блок catch, який слідує за ним.
Ловіть блок в Java
Ми використовуємо блок catch для обробки винятків. Це блок із ключовим словом “catch”. Блок catch слідує за блоком try.
Щоразу, коли в блоці try виникає виняток, тоді виконується код у блоці catch, який відповідає винятковій ситуації.
Загальний синтаксис блоку catch:
catch (Exception e){ //code to handle exception e }
Як правило, оголошений виняток повинен бути батьківським класом усіх винятків, тобто Exception. Але якщо існує більше одного винятку, ми також можемо написати конкретні типи винятків або генеровані винятки.
Далі ми обговоримо блок try-catch. Зверніть увагу, що для кожного блоку try ми можемо мати кілька блоків catch.
Try-Catch Java
Загальний синтаксис блоку try-catch показаний нижче:
try{ //code causing exception } catch (exception (exception_type) e (object)) { //exception handling code }
Блок try може мати кілька рядків коду, що може викликати кілька винятків. Кожен із цих винятків обробляється незалежним блоком catch.
Універсальний обробник винятків, об’єкт e класу Exception може обробляти всі винятки, але якщо ми хочемо обробляти конкретні винятки, то доцільно вказати загальний обробник винятків як останній блок catch.
Приклад Java Catch Catch
Тепер продемонструємо блок спроб-лову в Java. Тут, у блоці try, ми визначаємо операцію поділу. Дільник дорівнює нулю. Таким чином твердження, яке ділить ці два числа, породжує арифметичний виняток. У нас є блок catch, який визначає обробник для арифметичного винятку.
Нижче наведено приклад програми Java.
class Main { public static void main(String args()) { int val1, val2; try { //this block will contain statements that may raise exceptions System.out.println('Try Block:: Start'); val1 = 0; val2 = 25 / val1; System.out.println(val2); System.out.println('Try Block:: End'); } catch (ArithmeticException e) { //handler for ArithmeticException System.out.println('ArithmeticException :: Divide by Zero!!'); } System.out.println('Outside try-catch:: Rest of the code.'); } }
Вихідні дані
c ++ генерує випадкове число від 1 до 10
Виловлювання кількох винятків
Як уже зазначалося, блок try може містити код, який викликає більше одного винятку. У цьому випадку нам буде потрібно більше одного блоку catch для обробки кожного винятку. За одним блоком спроби можуть слідувати кілька блоків catch. Кожен блок catch буде обробляти незалежні винятки.
У випадку кількох блоків улову ми повинні пам’ятати наведені нижче пункти:
- У програмі Java у будь-який момент часу може статися лише один виняток. Крім того, у будь-який момент виконується лише один блок catch.
- Кілька блоків лову слід упорядковувати таким чином, щоб блок лову для найбільш конкретного винятку стояв спочатку, а потім загальний.
Наприклад, якщо ми маємо ArithmeticException і загальний виняток, то спочатку обробляється блок catch ArithmeticException, а потім виняток, який обробляє блок catch.
Наведений нижче приклад демонструє кілька блоків лову.
public class Main { public static void main(String() args) { //try block containing exception prone code try{ System.out.println('try Block:: Begin'); int myArray()=new int(5); myArray (5)=10/0; } //multiple catch blocks catch(ArithmeticException e) { System.out.println('Arithmetic Exception :: Divide by zero!!'); } catch(ArrayIndexOutOfBoundsException e) { System.out.println('ArrayIndexOutOfBounds :: Accessed index out of bounds'); } catch(Exception e) { System.out.println('Exception :: ' + e.getMessage ()); } System.out.println('rest of the code'); } }
Вихідні дані
У наведеній вище програмі піднімається ArithmeticException, який потрапляє в перший блок catch. Якби цей блок catch не був вказаний, тоді виняток поширився б на узагальнений блок catch.
Давайте трохи модифікуємо вищезазначену програму, щоб блок try мав два винятки. Тепер давайте подивимося результати.
public class Main { public static void main(String() args) { //try block containing exception prone code try{ System.out.println('try Block:: Begin'); int myArray()=new int(5); System.out.println('Array element 10 : ' + myArray(10)); myArray(5)=10/0; } //multiple catch blocks catch(ArithmeticException e) { System.out.println('Arithmetic Exception :: Divide by zero!!'); } catch(ArrayIndexOutOfBoundsException e) { System.out.println('ArrayIndexOutOfBounds :: Accessed index out of bounds'); } catch(Exception e) { System.out.println('Exception :: ' + e.getMessage ()); } System.out.println('rest of the code'); } }
Вихідні дані
Якщо ми бачимо цей результат, він показує ArrayIndexOutOfBoundsException. Це тому, що оператор, який викликає ArrayIndexOutOfBoundsException, виконується першим. Виняток викидається, і керування переходить до відповідного блоку catch.
Вкладений Try-Catch
Блок try всередині іншого блоку try називається вкладеним блоком try. Нам потрібні такі структури в певних ситуаціях, коли фрагмент коду, що міститься в коді спроби, може бути таким, що деякі рядки викликають певні винятки, а інший фрагмент коду - зовсім інший виняток.
У випадку вкладених спробних блоків спочатку виконується внутрішній спробний блок і обробляється виняток. Якщо внутрішній блок спроби не має відповідного блоку catch, тоді він поширюється на один рівень до батьківського блоку try. Таким чином виняток поширюється вгору, поки не буде знайдений відповідний обробник винятків.
Якщо немає обробника винятків, що відповідає винятковій ситуації, програма стрімко припиняється із створеним системою повідомленням.
Загальний синтаксис вкладеного блоку try наведено нижче:
try { //try_block 1; try { //try_block 2; } catch(Exception e) { //exception handler code } } catch(Exception e) { //exception handler code }
Давайте реалізуємо програму для демонстрації вкладеного блоку try-catch.
class Main{ public static void main(String args()){ //Main try block try{ //try block1 try{ System.out.println('Try Block1'); int num =15/0; System.out.println(num); } catch(ArithmeticException e1){ System.out.println('Block1 Exception: e1'); } //try block2 try{ System.out.println('Try Block2'); int num =100/0; System.out.println(num); } catch(ArrayIndexOutOfBoundsException e2){ System.out.println('Block2 Exception: e2'); } System.out.println('General statement after Block1 and Block2'); } catch(ArithmeticException e3){ System.out.println('Main Block Arithmetic Exception'); } catch(ArrayIndexOutOfBoundsException e4){ System.out.println('Main Block ArrayIndexOutOfBoundsException'); } catch(Exception e5){ System.out.println('Main Block General Exception'); } System.out.println('Code after Nested Try Block'); } }
Вихідні дані
У наведеній вище програмі ми маємо два блоки спроб, укладені в основний блок спроб. Обидва внутрішні блоки спроби мають код, який викликає ArithmeticException. Але ми запропонували відповідний блок catch лише для першого блоку, а не для другого блоку спроби.
Отже, другий блок поширює свій виняток на основний блок try, а потім обробляє його. Це видно з результату.
Нарешті, заблокувати в Java
Наразі ми бачили блок try-catch та вкладений try. Ми знаємо, що код, який, як очікується, викликає виняток, поміщений у блок спроби. Коли виникає виняток, тоді залишок коду в блоці try не виконується.
Або програма різко припиняється, якщо не обробляється виняток, або елемент керування передається обробнику винятків.
У такій ситуації виникає необхідність включити код, який повинен виконуватися незалежно від того, відбувається виняток чи ні. Це означає, що ми будемо виконувати фрагмент коду навіть тоді, коли виникає виняток, а також коли виняток не відбувається.
Але оскільки вимкнення блоку try відбувається після винятку, ми не можемо помістити цей код у блок try. Аналогічно, блок catch має обробник винятків, тому ми не можемо помістити це також у блок catch.
Таким чином, нам потрібен окремий блок, який містить код, який виконується незалежно від того, відбувається виняток чи ні. Java надає блок 'нарешті', який містить цей фрагмент коду.
Отже, нарешті блок у Java може містити критичні оператори, які мають бути виконані в програмі. Виконання цих тверджень повинно здійснюватися навіть тоді, коли виникає виняток чи ні.
Тому ми помістимо код, наприклад, закриття з'єднань, об'єкти потоку тощо або будь-який код очищення в блоці нарешті, щоб вони могли бути виконані, навіть якщо трапляється виняток.
Блок нарешті в Java зазвичай ставиться після блоку try або catch. Зверніть увагу, що блок нарешті не може існувати без блоку спроби. Коли блок нарешті включений у функцію try-catch, він стає “ спробуй-злови-нарешті ”Блок.
Ми можемо пропустити блок нарешті в коді обробки винятків. Це означає, що нарешті блок необов’язковий.
Якщо блок try не викликає жодного винятку, тоді блок нарешті буде виконаний після блоку try. Якщо в блоці try є виняток, тоді керування спочатку перейде до блоку catch, а потім блоку нарешті.
Виняток, що виникає в блоці нарешті, поводиться так само, як і будь-який інший виняток. Навіть якщо блок try містить оператор return або оператори розгалуження, такі як break and continue, тоді нарешті блок все одно буде виконаний.
Маючи на увазі ці моменти, давайте продовжимо загальний синтаксис та приклади нарешті блоку.
Загальний синтаксис блоку нарешті такий:
try { //code that might raise exception }catch { //code that handles exception }finally { //mandatory code to be executed }
Хоча нарешті блок завжди виконується, існують певні ситуації або випадки, коли він не виконується.
Ось такі випадки:
- Коли нитка мертва.
- Коли використовується метод System.exit ().
- Коли виникає виняток у блоці нарешті.
Давайте реалізуємо кілька програм, щоб продемонструвати остаточний блок.
class Main { public static void main (String args()) { //try block try { System.out.println ('::Try Block::'); int data = 125 / 5; System.out.println ('Result:' + data); } //catch block catch (NullPointerException e) { System.out.println ('::Catch Block::'); System.out.println (e); } //finally block finally { System.out.println (':: Finally Block::'); System.out.println ('No Exception::finally block executed'); } System.out.println ('rest of the code...'); } }
Вихідні дані
У наведеній вище програмі показано блок try-catch-нарешті. У блоці try виконується допустима операція, і, отже, не виникає жодних винятків. Отже, контроль не передається, щоб зловити від спроби, а остаточно блокувати.
Наступна програма - ще один приклад блоку try-catch-нарешті, але в цьому випадку виняток викидається в блок try, оскільки ми виконуємо ділення на нуль. Таким чином, нарешті блок виконується після спроби блоку catch.
class Main { public static void main(String args()) { //try block try{ System.out.println('::Try block::'); int num=67/0; System.out.println(num); } //catch block catch(ArithmeticException e){ System.out.println('::Catch block::'); System.out.println('ArithmeticException::Number divided by zero'); } //finally block finally{ System.out.println('::Finally block::'); } System.out.println('Rest of the code continues...'); } }
Вихідні дані
Виключення в Java
Java надає ключове слово “throw”, за допомогою якого ми можемо явно викидати винятки в коді. Наприклад, якщо ми перевіряємо арифметичні операції і хочемо створити деякі винятки після перевірки операндів, ми можемо це зробити, використовуючи ключове слово 'throw'.
Використовуючи ключове слово throw, ми можемо викидати перевірені або неперевірені винятки. Ключове слово throw також використовується для створення спеціальних винятків.
Загальний синтаксис ключового слова throw:
throw exception; or throw new exception_class('error message');
Нижче наведено приклад програми для демонстрації ключового слова throw.
public class Main{ static void validate_Age(int age){ //if specified age is <18, throw ArithmeticException if(age<18) throw new ArithmeticException('Not eligible to vote and drive!!'); else //print the message System.out.println('Eligible to vote and drive!!'); } public static void main(String args()){ //call validate_Age method validate_Age(10); System.out.println('rest of the code...'); } }
Вихідні дані
У наведеній вище програмі ми використовуємо метод для перевірки віку. Якщо вік<18, then an exception is thrown to indicate the age is not valid.
Закидає речення
Ми бачили блок спроб оголосити винятки. Він містить код, який може спричинити винятки. Існує ще один спосіб оголосити виняток, і він використовує ключове слово “throws”.
Декларація про виняток із використанням ключового слова “throws” повідомляє програмісту, що після ключового слова “throws” може бути виняток, і програміст повинен надати відповідний код обробника для цього виключення, щоб підтримувати нормальний потік програми.
Однак виникає питання, навіщо нам потрібне ключове слово “throws”, коли ми маємо більш надійний блок try-catch для оголошення та обробки винятків?
Однією з причин є те, що збільшується кількість винятків, які можуть виникнути, і кількість блоків catch, які обробляють винятки, також збільшується, оскільки один блок catch може обробляти лише один виняток.
Подібним чином, якщо в програмі багато методів, і кожен метод має безліч винятків, тоді код стане надмірно довгим і некерованим.
Таким чином, оголошення винятку за допомогою ключового слова throws у підписі методу, а потім обробки виклику методу за допомогою try-catch здається життєздатним рішенням.
деревоподібна структура даних c ++
Ще однією перевагою оголошення винятків за допомогою ключового слова throws є те, що ми змушені обробляти винятки. Якщо ми не надаємо обробник для оголошеного винятку, програма видасть помилку.
Загальний синтаксис ключового слова throws такий:
return_type method_name() throws exception_class_name{ //method code }
Давайте тепер реалізуємо програму Java для демонстрації ключового слова “throws”.
У цій програмі ми маємо клас Example_throw, в якому ми маємо метод testMethod. У підписі цього тестового методу ми оголошуємо два винятки IOException та Arithmetic Exception за допомогою ключового слова throws. Тоді в основній функції, викинуті винятки обробляються блоком catch.
import java.io.*; class Example_Throw { //declare exception using throws in the method signature void testMethod(int num) throws IOException, ArithmeticException{ if(num==1) throw new IOException('IOException Occurred'); else throw new ArithmeticException('ArithmeticException'); } }class Main{ public static void main(String args()){ try{ //this try block calls the above method so handle the exception Example_Throw obj=new Example_Throw(); obj.testMethod(1); }catch(Exception ex){ System.out.println(ex); } } }
Вихідні дані
Часті запитання
Запитання №1) Коли використовувати кидки методу VS try-catch у Java?
Відповідь: Ключове слово “throws” використовується для оголошення виключення з підписом методу. Ключове слово throw використовується для явного видалення винятку. Блок try-catch використовується для обробки винятків, виданих іншими.
Q # 2) Чи можемо ми використовувати кидки, спробувати зловити одним методом?
Відповідь: Ні. Ви не можете кинути виняток, а також зловити його тим же методом. Виняток, який оголошений за допомогою throws, повинен оброблятися у виклику методу, який викликає метод, який викликав виняток.
Q # 3) Що відбувається, коли блок catch видає виняток?
Відповідь: Коли в блок catch потрапляє виняток, програма зупиняє виконання. Якщо програма повинна продовжуватись, тоді повинен бути окремий блок try-catch для обробки винятків, викликаних у блоці catch.
Q # 4) Що таке try-catch-нарешті в Java?
Відповідь: Блок try-catch-нарешті містить три блоки, тобто блок try, catch catch і, нарешті, блок.
Блок try містить код, який може викликати виняток. Блок Catch містить обробник винятків для винятків у блоці try. Блок нарешті містить критичний код, який буде виконуватися незалежно від того, сталося виняток чи ні.
Q # 5) Чи може нарешті заблокувати наявність try-catch?
Відповідь: Так, якщо у нас є код очищення, який може викликати виняток у блоці нарешті, тоді ми можемо мати блок спроби-лову. Однак це виглядає потворно.
Висновок
У цьому підручнику ми обговорили різні ключові слова, що використовуються при обробці винятків у Java. Ми обговорили такі ключові слова, як спробувати, зловити, нарешті, кинути і кинути.
Код, який, можливо, викличе виняток, укладається в блок try, а catch забезпечує обробник винятку. Блок нарешті виконує вкладений в нього код незалежно від того, викинутий виняток чи ні. Блок нарешті, як правило, слідує за блоком try або try-catch.
Ми використовуємо ключове слово throws, щоб оголосити винятки з підписом методу, а throw використовується явно для викидів. Зазвичай ми використовуємо ключове слово throw для створення спеціальних винятків.
=> Ознайомтесь з Ідеальним посібником з навчання Java тут.
Рекомендована література
- Винятки Java та обробка винятків з прикладами
- Як обробляти ArrayIndexOutOfBoundsException у Java?
- Підручник JAVA для початківців: 100+ практичних навчальних посібників Java
- Обробка винятків JDBC - Як обробляти винятки SQL
- Підручник з обробки винятків C # із прикладами коду
- Повне керівництво по обробці винятків PL SQL з прикладами
- Обробка винятків у C ++
- Python Try Except - обробка винятків Python на прикладах