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