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:
ArithmeticExceptionprotože se snažíme číslo vydělit 0.ArrayIndexOutOfBoundsExceptionprotož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.








