Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпори JAVA.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
178.34 Кб
Скачать

53.Виняткові ситуації, які перевіряються і які не перевіряються

Всі виняткові ситуації можна розділити на дві категорії оброблювані

( checked ) і не оброблювані ( unchecked ) .Усі винятки , породжені від java.lang.Exception є оброблюваними . Тобто під

час компіляції перевіряється - чи передбачена обробка можливих виняткових

ситуацій .Винятки , породжені від java.lang.RunTimeException , є необроблюваними,

і компілятор не вимагає обов'язкової їх обробки.Як правило , оброблювані виключення призначені для обробки ситуацій пов'язаних з оточенням програми ( мережевим , файловим введенням- висновком та ін), які можуть виникнути незалежно від того , коректно написаний код чи ні. наприклад ,відкриття мережевого з'єднання або файлу може призвести до виникнення помилки, і компілятор вимагає від програміста передбачити якісь дії для обробки можливих проблем. ( Можливо ніяких дій зроблено не буде, тобто блок catch () { } можна залишити порожнім , проте компілятор це трактує як обробку виключення і не видасть повідомлення про помилку компіляції ) Всі призначені для користувача виключення , породжені від java.lang.Exception (або його нащадків ) є робочими .Необроблювані винятки , це помилки програми , які при правильному кодуванні виникати не повинні (наприклад , java.lang.IndexOfBoundException ,java.lang.ArifmeticException виникають відповідно при вказівці індексу виходить за межі масиву і при діленні на нуль ) . Тому , щоб не захаращувати програму ,компілятор дозволяє не обробляти за допомогою блоків try {} catch ( ) виключення цього типу.

Винятки , породжені від Error , так само не є робочими . ці помилки

призначені для того що б повідомити програму про виникнення збоїв які

програмним способом усунути складно , або неможливо взагалі. Як приклад

можна навести StackOverflowError , OutOfMemoryError .

Слід звернути увагу , що хоча необроблювані помилки не обов'язково поміщати

в блоки try {} catch ( ) ... , вони обробляються точно так само як і звичайні помилки. Тобто якщо ви не можете гарантувати , що В час виконання не буде порушена межа

масиву (наприклад при динамічному визначенні розміру масиву) , то код у якому

проводиться звернення до елементів масиву слід помістити в блок try {}

catch ( java.lang.IndexOfBoundException ex ) { ...} .

Далі , у разі якщо в підпрограмі можуть виникати необроблювані помилки , то

вказівка ​​ключового слова throws не є обов'язковим.

Помилки ( Error) , говорять про наявність фатальних ситуацій і немає необхідності обробляти їх. Вони можуть свідчити про помилки програми , але , як правило , це непереборні помилки віртуальної машини Java. Наприклад , вичерпання вільної пам'яті , переповнення стеку і т.д.В розробці і проектуванні програмного забезпечення використовується поняття контракту . Одним з аспектів є чітке

розмежування відповідальності між викликаними і викликаючими методами. наприклад

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

параметри і не повинен знати нічого про обробку неправильних . Крім того він повинен

повідомити викликає метод про виникнення цієї ситуації , відразу по її виникненню .

Для реалізації цього підходу рекомендується використовувати винятки які обробляються( checked ).Як було сказано раніше , можливе завдання декількох операторів catch для одного блоку try . Якщо програміст бажає перехоплювати якийсь набір виняткових ситуацій , він може вказати в блоці catch батьківський клас замість перерахування кількох підкласів . Наприклад можна перехоплювати всі виключення породжені від java.lang.Exception наступним чином 

  try {  ... } catch ( Exception e ) {  ... }

Так як батьком усіх винятків є java.lang.Throwable , то якщо необхідно в якому - небудь місці коду перехоплювати всі виняткові ситуації , то цілком застосовна

ось така конструкція  try {  ... } catch ( Throwable e ) {  ... }

проте слід уникати використання такої конструкції без явних на те причин. Т.к. в блоці catch будуть оброблятися самі різні помилки , що порушить структуру коду і ускладнить його розуміння . У разі якщо в конструкції обробки виключень використовується декілька операторів catch , то класи виключень потрібно перераховувати в них послідовно , від менш загальних до більш загальних . Розглянемо два приклади try { ...}

catch ( Exception e ) { ...}catch ( IOException ioe ) { ...}catch ( UserExcetion ue ) { ...}

У даному прикладі при виникненні виняткової ситуації ( клас якої породжений

від Exception ) виконуватиметься завжди тільки перший блок catch . Решта не будуть

виконані ні за яких умов . Ця ситуація відстежується компілятором , який

повідомляє про UnreachableCodeException (помилка - недосяжний код ) . правильно дана

конструкція буде виглядати так

 try {

 ...}

catch ( UserExcetion ue ) {

 ...}

catch ( IOException ioe ) {

 ...}

catch ( Exception e ) {

 ...}

У цьому випадку буде проведена послідовна обробка виключень . І у випадку

якщо не передбачена обробка того типу винятку , яке виникло (наприклад ,

AnotherUserException ) , буде виконаний блок catch ( Exception e ) { ...}

Якщо спрацьовує один з блоків catch , то інші блоки в даній конструкції try - catch

виконуватися не будуть.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]