Јава ухвати вишеструке изузетке

У овом упутству научићемо да рукујемо вишеструким изузецима у Јави уз помоћ примера.

Пре Јаве 7, морали смо да напишемо више кодова за руковање изузецима за различите типове изузетака, чак и ако је било вишка кода.

Узмимо пример.

Пример 1: Више блокова улова

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException e) ( System.out.println(e.getMessage()); ) catch (ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) ) 

Оутпут

 / по нули 

У овом примеру могу се јавити два изузетка:

  • ArithmeticException јер покушавамо да број поделимо са 0.
  • ArrayIndexOutOfBoundsException јер смо прогласили нови целобројни низ са границама низа 0 до 9 и покушавамо да доделимо вредност индексу 10.

Исписујемо поруку о изузетку у оба catchблока, тј. У дупликату кода.

Асоцијативност оператора доделе =је здесна налево, па ArithmeticExceptionсе прво баца са поруком / са нулом.

Обрадите вишеструке изузетке у блоку цатцх

У Јави СЕ 7 и новијим верзијама сада можемо ухватити више врста изузетака у једном catchблоку.

Свака врста изузетка којом catchблок може руковати одваја се помоћу вертикалне шипке или цеви |.

Његова синтакса је:

 try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block ) 

Пример 2: Мулти-цатцх блок

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) ) 

Оутпут

 / по нули 

Хватање вишеструких изузетака у једном catchблоку смањује дуплирање кода и повећава ефикасност.

Бајт код генерисан током компајлирања овог програма биће мањи од програма који има више catchблокова, јер не постоји сувишак кода.

Напомена: Ако catchблок обрађује вишеструке изузетке, параметар цатцх је имплицитно final. То значи да не можемо доделити никакве вредности за хватање параметара.

Изузетак базе хватања

Приликом хватања вишеструких изузетака у једном catchблоку, правило се генерализује на специјализовано.

То значи да ако у catchблоку постоји хијерархија изузетака , основни изузетак можемо ухватити само уместо да ухватимо вишеструке специјализоване изузетке.

Узмимо пример.

Пример 3: Хватање само основне класе изузетка

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception e) ( System.out.println(e.getMessage()); ) ) ) 

Оутпут

 / по нули 

Знамо да су све класе изузећа поткласе Exceptionкласе. Дакле, уместо да ухватимо вишеструке специјализоване изузетке, можемо једноставно ухватити Exceptionкласу.

Ако је основна класа изузетака већ наведена у catchблоку, немојте користити подређене класе изузетака у истом catchблоку. У супротном, добићемо грешку у компилацији.

Узмимо пример.

Пример 4: Хватање основних и подређених класа

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) ) 

Оутпут

 Маин.јава:6: грешка: Алтернативе у наредби са више улова не могу се повезати поткласирањем 

У овом примеру, ArithmeticExceptionи ArrayIndexOutOfBoundsExceptionсу оба поткласа Exceptionкласе. Дакле, добијамо грешку у компилацији.

Занимљиви Чланци...