W tym samouczku nauczymy się obsługi wielu wyjątków w Javie na podstawie przykładów.
Przed Java 7 musieliśmy napisać wiele kodów obsługi wyjątków dla różnych typów wyjątków, nawet jeśli występowała redundancja kodu.
Weźmy przykład.
Przykład 1: Wiele bloków catch
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()); ) ) )
Wynik
/ o zero
W tym przykładzie mogą wystąpić dwa wyjątki:
ArithmeticExceptionponieważ próbujemy podzielić liczbę przez 0.ArrayIndexOutOfBoundsExceptionponieważ zadeklarowaliśmy nową tablicę liczb całkowitych z granicami tablicy od 0 do 9 i próbujemy przypisać wartość indeksowi 10.
Drukujemy komunikat o wyjątku w obu catchblokach, czyli zduplikowany kod.
Kojarzenie operatora przypisania =jest od prawej do lewej, więc jako ArithmeticExceptionpierwszy z komunikatem wyrzucany jest znak / o zero.
Obsługa wielu wyjątków w bloku catch
W Javie SE 7 i nowszych wersjach możemy teraz wychwycić więcej niż jeden typ wyjątków w jednym catchbloku.
Każdy typ wyjątku, który może być obsługiwany przez catchblok, jest oddzielony pionową kreską lub rurką |.
Jego składnia to:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Przykład 2: Blok Multi-catch
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()); ) ) )
Wynik
/ o zero
Przechwytywanie wielu wyjątków w jednym catchbloku ogranicza duplikowanie kodu i zwiększa wydajność.
Kod bajtowy wygenerowany podczas kompilacji tego programu będzie mniejszy niż program mający wiele catchbloków, ponieważ nie ma redundancji kodu.
Uwaga: Jeśli catchblok obsługuje wiele wyjątków, parametr catch jest niejawnie final. Oznacza to, że nie możemy przypisać żadnych wartości do parametrów catch.
Podstawowy wyjątek
Podczas wychwytywania wielu wyjątków w jednym catchbloku reguła jest uogólniana na wyspecjalizowane.
Oznacza to, że jeśli w catchbloku istnieje hierarchia wyjątków , możemy przechwycić tylko wyjątek podstawowy, zamiast przechwytywać wiele wyjątków wyspecjalizowanych.
Weźmy przykład.
Przykład 3: Przechwytywanie tylko podstawowej klasy wyjątków
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()); ) ) )
Wynik
/ o zero
Wiemy, że wszystkie klasy wyjątków są podklasami tej Exceptionklasy. Zatem zamiast łapać wiele wyspecjalizowanych wyjątków, możemy po prostu złapać Exceptionklasę.
Jeśli podstawowa klasa wyjątków została już określona w catchbloku, nie należy używać podrzędnych klas wyjątków w tym samym catchbloku. W przeciwnym razie otrzymamy błąd kompilacji.
Weźmy przykład.
Przykład 4: Przechwytywanie podstawowych i podrzędnych klas wyjątków
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()); ) ) )
Wynik
Main.java:6: error: Alternatywy w instrukcji multi-catch nie mogą być powiązane przez podklasy
W tym przykładzie, ArithmeticExceptioni ArrayIndexOutOfBoundsExceptionto zarówno podklasy w Exceptionklasie. Tak więc otrzymujemy błąd kompilacji.








