У овом упутству научићемо да рукујемо вишеструким изузецима у Јави уз помоћ примера.
Пре Јаве 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класе. Дакле, добијамо грешку у компилацији.








