Java przechwytuje wiele wyjątków

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 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.

Interesujące artykuły...