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:
ArithmeticException
ponieważ próbujemy podzielić liczbę przez 0.ArrayIndexOutOfBoundsException
ponieważ 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 catch
blokach, czyli zduplikowany kod.
Kojarzenie operatora przypisania =
jest od prawej do lewej, więc jako ArithmeticException
pierwszy 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 catch
bloku.
Każdy typ wyjątku, który może być obsługiwany przez catch
blok, 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 catch
bloku ogranicza duplikowanie kodu i zwiększa wydajność.
Kod bajtowy wygenerowany podczas kompilacji tego programu będzie mniejszy niż program mający wiele catch
bloków, ponieważ nie ma redundancji kodu.
Uwaga: Jeśli catch
blok 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 catch
bloku reguła jest uogólniana na wyspecjalizowane.
Oznacza to, że jeśli w catch
bloku 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 Exception
klasy. Zatem zamiast łapać wiele wyspecjalizowanych wyjątków, możemy po prostu złapać Exception
klasę.
Jeśli podstawowa klasa wyjątków została już określona w catch
bloku, nie należy używać podrzędnych klas wyjątków w tym samym catch
bloku. 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, ArithmeticException
i ArrayIndexOutOfBoundsException
to zarówno podklasy w Exception
klasie. Tak więc otrzymujemy błąd kompilacji.