В този урок ще се научим да се справяме с множество изключения в Java с помощта на примери.
Преди Java 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се хвърля първо със съобщението / от нула.
Обработвайте множество изключения в блок за улов
В Java SE 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блок обработва множество изключения, параметърът 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()); ) ) )
Изход
Main.java:6: грешка: Алтернативите в оператор за многократно хващане не могат да бъдат свързани чрез подкласиране
В този пример ArithmeticExceptionи ArrayIndexOutOfBoundsExceptionса двата подкласа на Exceptionкласа. И така, получаваме грешка при компилацията.








