Умова throws

Перше, що кидається в очі в наведеному вище методі replace Value, – це список перевіряються винятків, які в ньому порушуються У Java необхідно перерахувати перевіряються винятку, порушувані методом, оскільки програміст при виклику методу повинен знати їх в такій же мірі, в якій він уявляє собі нормальна поведінка методу Перевіряються винятку, порушувані методом, не поступаються за своєю важливістю типом значення, що повертається – і те й інше необхідно оголосити

Перевіряються винятку оголошуються в умові throws, яке може містити список значень, відокремлюваних один від одного комами

Усередині методу дозволяється порушувати винятку, які є розширеннями типу Exception в умові throws, оскільки завжди допускається полиморфно використовувати клас замість його суперкласу Метод може порушувати кілька різних виключень, які є розширеннями одного конкретного класу, і при цьому оголосити в умові throws всього один суперклас Проте, роблячи таким чином, ви приховуєте від працюючих з методом програмістів корисну інформацію, тому що вони не будуть знати, які з можливих розширених типів виключень збуджуються

методом З метою належного документування умова throws має бути якомога більш повним і детальним

Контракт, який визначається умовою throws, зобовязаний неухильно дотримуватися – можна порушувати лише ті винятки, які вказані в даному умови Збудження будь-якого іншого винятку (пряме, за допомогою throw, або непряме, через виклик іншого методу) є неприпустимим Відсутність умови throws не означає, що метод може порушувати будь-які виключення навпаки, воно говорить про те, що він не збуджує ніяких винятків

Всі стандартні виключення часу виконання (такі, як ClassCast Exception і ArithmeticException) представляють собою розширення класу RuntimeException Про більш серйозні помилки сигналізують винятку, які є розширеннями класу Error і можуть виникнути в довільний момент в довільній точці програми RuntimeException і Error – єдині винятки, які не потрібно перераховувати в умові throws вони є загальноприйнятими і можуть збуджуватися в будь-якому методі, тому компілятор не перевіряє їх Повний список класів стандартних непроверяемих винятків наведений у Додатку Б

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

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

При виклику методу, у якого в умові throws приведено проверяемое виняток,

є три варіанти:

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

Перехопити виняток і перенаправити його в обробник одного з ваших винятків, для чого порушити виняток типу, оголошеного у вашому умови throws

Оголосити цей виняток в умові throws і відмовитися від його обробки в вашому методі (хоча в ньому може бути присутнім умова finally, яке спочатку виконає деякі завершальні дії подробиці наводяться нижче)

При будь-якому з цих варіантів вам необхідно перехопити виняток, порушену іншим методом це стане темою наступного розділу

Вправа 71

Створіть клас-виключення ObjectNotFoundException для класу Linked List, побудованого нами в попередніх вправах Включіть в нього метод find, призначений для пошуку обєктів у списку, який або повертає потрібний обєкт LinkedList, або збуджує виняток, якщо обєкт відсутній у списку Чому такий варіант виявляється більш кращим, ніж повернення значення null для незнайденого обєкта Які дані повинні входити в ObjectNotFoundException

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


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

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*