Java zachycuje více výjimek

V tomto tutoriálu se pomocí příkladů naučíme zpracovávat více výjimek v Javě.

Před Java 7 jsme museli psát několik kódů pro zpracování výjimek pro různé typy výjimek, i když došlo k redundanci kódu.

Vezměme si příklad.

Příklad 1: Více bloků úlovku

 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()); ) ) ) 

Výstup

 / nulou 

V tomto příkladu mohou nastat dvě výjimky:

  • ArithmeticException protože se snažíme číslo vydělit 0.
  • ArrayIndexOutOfBoundsException protože jsme deklarovali nové celočíselné pole s hranicemi pole 0 až 9 a snažíme se přiřadit hodnotu indexu 10.

Tiskneme zprávu o výjimce v obou catchblocích, tj. Duplicitní kód.

Asociativita operátora přiřazení =je zprava doleva, takže ArithmeticExceptionje vyvolána nejprve se zprávou / o nulu.

Zpracování více výjimek v bloku zachycení

V prostředí Java SE 7 a novějším nyní můžeme zachytit více než jeden typ výjimky v jednom catchbloku.

Každý typ výjimky, který může být catchblokem zpracován, je oddělen pomocí svislého pruhu nebo potrubí |.

Jeho syntaxe je:

 try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block ) 

Příklad 2: Blok s více úlovky

 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()); ) ) ) 

Výstup

 / nulou 

Chytání více výjimek v jednom catchbloku snižuje duplikaci kódu a zvyšuje efektivitu.

Bajtkód vygenerovaný při kompilaci tohoto programu bude menší než program s více catchbloky, protože nedochází k redundanci kódu.

Poznámka: Pokud catchblok zpracovává více výjimek, parametr catch je implicitně final. To znamená, že nemůžeme přiřadit žádné hodnoty k zachycení parametrů.

Chytání základní výjimky

Při chytání více výjimek v jednom catchbloku je pravidlo zobecněno na specializované.

To znamená, že pokud v catchbloku existuje hierarchie výjimek , můžeme chytit základní výjimku pouze namísto chytání více specializovaných výjimek.

Vezměme si příklad.

Příklad 3: Chytání pouze základní třídy výjimek

 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()); ) ) ) 

Výstup

 / nulou 

Víme, že všechny třídy výjimek jsou podtřídami Exceptiontřídy. Takže místo chytání několika specializovaných výjimek můžeme jednoduše chytit Exceptiontřídu.

Pokud již byla v catchbloku zadána základní třída výjimek , nepoužívejte ve stejném catchbloku podřízené třídy výjimek . V opačném případě se zobrazí chyba kompilace.

Vezměme si příklad.

Příklad 4: Chytání základních a podřízených tříd výjimek

 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()); ) ) ) 

Výstup

 Main.java:6: chyba: Alternativy v příkazu více úlovků nelze podle podtřídy spojit 

V tomto příkladu, ArithmeticExceptiona ArrayIndexOutOfBoundsExceptionjsou oba podtřídy Exceptiontřídy. Takže se zobrazí chyba kompilace.

Zajímavé články...