Новини високих технологій
» » Java: виключення і їх обробка

Java: виключення і їх обробка

12-05-2017, 12:36
2 506
Будь-яка програма буде працювати стабільно тільки в тому випадку, якщо її вихідний код налагоджений, і в ньому відсутні умови, які можуть викликати непередбачені ситуації. Процес відлову можливих збоїв виконується на стадії програмування. Для цього розробник враховує всі передбачувані результати і намагається обмежити дію помилки таким чином, щоб вона не змогла порушити роботу програми або призвести до її краху.

Коли може знадобитися обробка виключень

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


Java обробка виключень

Що потрібно враховувати? Мова Java володіє своїм вбудованим функціоналом обробки винятків. Звичайно ж великий відсоток помилок відловлюють ще на стадії компіляції, коли система автоматично повідомить про те, що використовувати її далі неможливо. Але існує і такий вид винятків, який виникає під час роботи програми. Розробник повинен зуміти передбачити це і спроектувати код таким чином, щоб він не викликав помилки, а обробив її особливим способом або передав керування в іншу гілку. В Java такий вилов винятків нав'язується компілятором, тому типові проблеми відомі і мають свою стандартну схему виконання.

Типові виключення

Найпростішим прикладом, при якому можна отримати виняток — це поділ. Незважаючи на всю його простоту, в вираженні, як дільник може виявитися нуль, що призведе до помилку. Добре, якщо його появу можна передбачити і запобігти. Але такий варіант доступний не завжди, тому вилов винятку потрібно організувати безпосередньо при виникненні «ділення на нуль».


В Java механізм обробки перехоплення помилки виглядає так: в купі створюється об'єкт виключення, так само як і будь-який інший; природний хід програми переривається; механізм виключення намагається знайти альтернативний спосіб продовження коду; знайшовши місце безпечного виконання програми в процесорі, робота або відновиться, або відбудеться реалізація винятку особливим способом. Найпростіший приклад створення помилки може виглядати таким чином: if (a == null) throw new NullPointerException(); Тут змінна a перевіряється на ініціалізацію, тобто не дорівнює посилання на об'єкт null. У разі, якщо така ситуація виникла і потрібна особлива обробка, викидається виключення з допомогою throw new NullPointerException().

Трохи подробиць про ключових словах

При роботі з винятками часто доводиться використовувати ключові слова Java для позначення того чи іншого дії. В даній мові програмування їх п'ять: Try. Це ключове слово вже зустрічалося і означає воно перехід в ділянку коду, який може згенерувати виняток. Блок обмежується фігурними дужками {}. Catch. Перехоплює потрібний тип винятку і обробляє його відповідним чином. Finally. Дане ключове слово є додатковим і служить для виконання якогось ділянки коду, який необхідний у будь-якому випадку, навіть якщо жодна виняток не перехоплено. Безпосередньо після блоку try. Throw — дозволяє створювати виключення Java в будь-якому місці коду. Throws — ключове слово, яке ставиться у сигнатурі методу. Воно означає, що наступний код може викинути виняток Java зазначеного типу. Така мітка служить сигналом для розробників, що потрібно мати на увазі — метод може спрацювати не так, як від нього очікують.

Вилов за допомогою try

Викид в Java винятку, природно припускає, що воно буде особливим чином оброблена. Найзручніше це зробити, якщо ділянка коду відгороджений в якийсь блок. Який можливо містить виняток. При виконанні такого коду віртуальна машина знайде непередбачену ситуацію, зрозуміє, що знаходиться в критичному блоці і передасть управління в ділянку з обробкою.
В Java код загортається в спеціальний блок try, всередині якого може бути згенеровано виняток. Таким чином, в нього поміщається відразу кілька непередбачених ситуацій, які будуть виловлені в одному місці, не розповзаючись по коду. Самий типовий код з блоком обробки виглядає так: try { //Тут буде визначено код, який може породити виняток } catch (Тип_исключения_1 идентификатор_1) { //Тут відбувається обробка винятку, згідно з його типом і умовам; } catch (Тип_исключения_2 идентификатор_2) { //Тут відбувається обробка винятку, згідно з його типу і умов; } Ключове слово catch повідомляє про те, що код, підданий перевірці на виняток, потрібно обробити так, як описано далі, за умови, що він відповідає його типу. Ідентифікатор може використовуватися всередині блоку коду обробки як аргументи.

Finally

Як стало зрозуміло з попередньої глави, блоки catch ловлять виключення і обробляють їх. Але дуже часто виникає ситуація, коли повинен пройти якийсь код незалежно від того, чи були виловлені помилки. Для цього існує ключове слово finally. Воно застосовується для збільшення значень різних лічильників, закриття файлів або з'єднань з мережею.
В даному ділянці представлені кілька блоків catch з вигаданими методами відлову винятків. Наприклад, код, що міститься в try породжує непередбачену ситуацію типу Cold. Тоді в консоль будуть виведені вирази «Caught cold!» і «Is that something to cheer about?». Тобто блок finally виконується в будь-якому випадку. Насправді спосіб уникнути запуску finally існує. Пов'язаний він із завершенням роботи віртуальної машини. Знайти, як це реалізувати, можна на просторах мережі Інтернет.

Ключове слово throw

Throw генерує виняток. Синтаксис виглядає так: throw new NewException(); Тут створюється нове виключення з типом NewException(). В якості типу можуть використовуватися вже входять в стандартні бібліотеки Java класи і визначені раніше розробником власного виробництва. Така конструкція входить в опис якого-небудь методу, виклик якого потім має відбуватися в рамках блоку try, для того, щоб була можливість його перехопити.

Ключове слово throws

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

Try з ресурсами

В Java версії 7 розробники включили таке важливе нововведення, як обробка блоку try з ресурсами. Багато створювані об'єкти в Java, після їх використання повинні бути закриті для економії ресурсів. Раніше доводилося це враховувати і зупиняти такі екземпляри вручну. Тепер у них з'явився інтерфейс AutoClosable. Він допомагає автоматично закривати вже використані об'єкти, розміщені в блок try. Завдяки такому підходу писати код стало зручніше, в його читаність значно підвищилася.

Власні класи винятків Java

Творці описуваного мови програмування врахували багато аспектів при проектуванні типів непередбачених ситуацій. Однак, всі варіанти результату подій запобігти не вийде, тому в Java реалізована можливість визначення своїх власних винятків, що підходять саме під потреби конкретного коду. Найпростіший спосіб створення — успадкувати від найбільш відповідного до контексту об'єкта.
Тут відбулося спадкування від Exception, класу, який використовується для визначення власних винятків. У MyException є два конструктора — один за замовчуванням, другий — з аргументом msg типу String. Потім public класі FullConstructors реалізований метод f, сигнатура якого містить throws MyException. Це ключове слово означає, що f може викинути виняток Java типу MyException. Далі в тілі методу проводиться вивід текстової інформації в консоль і власне сама генерація MyException, за допомогою throw. Другий метод трохи відрізняється від першого тим, що при створенні виключення, йому передається рядковий параметр, який буде відображений у консолі при вилові. В main видно, що f() і g() поміщені в блок перевірки try, а ключове слово catch налаштоване на вилов MyException. Результатом обробки буде висновок повідомлення про помилку в консоль:
Таким чином вийшло додати виключення Java, створені власноруч.

Архітектура винятків

Як і всі об'єкти в Java, виключення також успадковуються і мають ієрархічну структуру. Кореневим елементом всіх помилок, що викидаються в цій мові програмування є клас java.lang.Throwable. Від нього успадковуються два види — Error і Exception.
Error — оповіщає про критичні помилки і являє собою не перевірили виключення Java. Перехоплення і обробка таких даних у більшості випадків відбувається на стадії розробки і не потребує впровадження в код кінцевого програми. Найбільш часто використовуваним класом для створення і аналізу винятків служить Exception. Який, у свою чергу, ділиться на кілька гілок, в тому числі RuntimeException. До RuntimeException відносяться виключення часу виконання, тобто відбуваються під час роботи програми. Всі успадковані від нього класи є непровіряємими.

Часто зустрічаються виключення

В Java винятку, список яких представлений нижче, використовуються найбільш часто, тому варто описати кожен з них детальніше: ArithmeticException. Сюди входять помилки пов'язані з арифметичними операціями. Найяскравіший приклад — ділення на нуль. ArrayIndexOutOfBoundsException — звернення до номеру елемента масиву, який перевищує загальну його довжину. ArrayStoreException — спроба присвоїти елементу масиву несумісного типу. ClassCastException — спроба неправильного приведення одного типу до іншого. IllegalArgumentException — використання неправильного аргументу у виклику методу. NegativeArraySizeException — виняток при створенні масиву від'ємного розміру. NullPointerException — неправильне використання посилання на значення null. NumberFormatException — виникає при невірному перетворення рядка в число. UnsupportedOperationException — операція не підтримується. Дані приклади являють собою не перевірили типи винятків Java. А ось так виглядають перевіряються: ClassNotFoundException — клас не виявлено. IllegalAcccessException — обмеження доступу до класу. InterruptedException — переривання роботи потоку. NoSuchFieldException — не існує потрібне поле.

Інтерпретація винятків

Говорячи про часто зустрічаються винятки потрібно відзначити, що їх інтерпретація в ході розробки, може бути сприйнята неправильно. Далі йде невеликий список, що пояснює більш докладно, коли може виникнути непередбачена ситуація.
NullPointerException. Самим першим випадком, коли виникає виняток, є звернення до посилання на об'єкт, яка дорівнює null. Також це поширюється на методи нульового екземпляра класу. NullPointerException може бути кинутий і в разі отримання довжини масиву дорівнює null. Уникнути таких ситуацій допоможе періодична перевірка об'єктів на значення null. ArrayIndexOutOfBoundsException. Будь-яка програма не може існувати без використання масивів. Відповідно, часте звернення до них може породжувати і помилки. Виникає виняток, коли розробник намагається звернутися до елементу масиву, який відсутній в списку індексів. Наприклад, запитувана значення вище довжини або менше нуля. Дуже часто з'являється в результаті того, що рахунок у масиві починається з нуля.

Висновки

Обробка винятків Java — потужний інструмент середовища, що значно полегшує роботу програміста і дозволяє йому створювати чистий і позбавлений помилок код. Від того, наскільки плавно і стабільно функціонує додаток, залежить статус і репутація компанії-розробника.
Звичайно, в більш або менш простих програмах відстежити позаштатні ситуації набагато простіше. А ось у великих автоматизованих комплексах на кілька сотень тисяч рядків таке можливо тільки в результаті проведення тривалої налагодження і тестування. За Java виключення, помилки від яких виникають в деяких додатках, окремі компанії пропонують винагороду при їх знаходженні ентузіастами. Особливо цінуються ті, які викликають порушення політики безпеки програмного комплексу.
Цікаво по темі
Елементи об'єктної моделі Java: абстрактний клас, інтерфейс
Елементи об'єктної моделі Java: абстрактний клас, інтерфейс
Головна думка абстрактного класу полягає в наступному тезі: іноді потрібні не готові класи, а в «сирому» вигляді. Такі заготовки не можна прямо
Як здійснюється перевірка Java-версії?
Як здійснюється перевірка Java-версії?
У процесі виконання завдань на комп'ютері або ноутбуці іноді потрібна наявність Java. Однією з найпоширеніших ...
Java: робота з файлами - запис, читання, видалення
Java: робота з файлами - запис, читання, видалення
Переважна більшість програм, написаних на Java, так чи інакше взаємодіють з файлами, зберігаючи і дістаючи звідти потрібну інформацію. Для операцій з
Java Array. Масиви в Java. Java для початківців
Java Array. Масиви в Java. Java для початківців
Для роботи з великою кількістю значень в Java, як у більшості сучасних високорівневих мов програмування, є такий потужний інструмент, як масиви.
BigInteger Java: робота з великими числами
BigInteger Java: робота з великими числами
Для роботи з числами, які не можуть зберігається в стандартних примітивних типів, в Java є спеціальний клас BigInteger. Він не тільки інкапсулює їх
Java: InputStream. Потоки введення
Java: InputStream. Потоки введення
У даній статті ми розглянемо базовий клас для потоків вводу даних в Java - InputStream. Розберемо основну його функціональність і реалізації, які