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 catch
blocích, tj. Duplicitní kód.
Asociativita operátora přiřazení =
je zprava doleva, takže ArithmeticException
je 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 catch
bloku.
Každý typ výjimky, který může být catch
blokem 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 catch
bloku snižuje duplikaci kódu a zvyšuje efektivitu.
Bajtkód vygenerovaný při kompilaci tohoto programu bude menší než program s více catch
bloky, protože nedochází k redundanci kódu.
Poznámka: Pokud catch
blok 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 catch
bloku je pravidlo zobecněno na specializované.
To znamená, že pokud v catch
bloku 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 Exception
třídy. Takže místo chytání několika specializovaných výjimek můžeme jednoduše chytit Exception
třídu.
Pokud již byla v catch
bloku zadána základní třída výjimek , nepoužívejte ve stejném catch
bloku 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, ArithmeticException
a ArrayIndexOutOfBoundsException
jsou oba podtřídy Exception
třídy. Takže se zobrazí chyba kompilace.