Řetězované výjimky v Javě umožňují přidružit jednu výjimku k jiné, tj. jedna výjimka popisuje příčinu jiné výjimky.
- Uvažujme například situaci, ve které metoda vyvolá an Aritmetická výjimka kvůli pokusu o dělení nulou.
- Ale hlavní příčinou chyby bylo selhání I/O, které způsobilo, že dělitel byl nulový.
- V takových případech zřetězené výjimky pomáhají šířit primární i základní příčiny chyby.
Příklad : Následující příklad ukazuje, jak používat zřetězené výjimky v Javě.
Java// Working of chained exceptions public class Geeks { public static void main(String[] args) { try { // Creating an exception NumberFormatException ex = new NumberFormatException('Primary Exception'); // Setting the cause of the exception ex.initCause(new NullPointerException('Root cause of the exception')); // Throwing the exception with a cause throw ex; } catch (NumberFormatException ex) { // Displaying the primary exception System.out.println('Caught Exception: ' + ex); // Displaying the root cause of the exception System.out.println('Cause of Exception: ' + ex.getCause()); } } }
Výstup
Caught Exception: java.lang.NumberFormatException: Primary Exception Cause of Exception: java.lang.NullPointerException: Root cause of the exception
Poznámka: Zřetězené výjimky známé také jako vnořené výjimky nám umožňují přiřadit příčinu k výjimce v Javě. To je užitečné, když chceme šířit informace o původní příčině výjimky.
Konstruktéři
- Vhazovatelný (příčina házení) : Kde příčina je výjimka, která způsobuje aktuální výjimku.
- Vhazovatelné (příčina vhazování řetězcové zprávy) : Kde msg je zpráva o výjimce a příčina je výjimka, která způsobuje aktuální výjimku.
Metody vrhacích podpůrných zřetězených výjimek
- getCause() : Tato metoda vrací skutečnou příčinu výjimky.
- initCause (možná příčina) : Tato metoda nastavuje příčinu volání výjimky.
Příklad: Použití vlastní zprávy se zřetězenými výjimkami
V Javě můžeme zřetězit výjimky pomocí konstruktoru třídy Throwable.
Java// Use a custom message with chained exception public class Geeks { public static void main(String[] args) { try { // Code that might throw an exception int[] n = new int[5]; int divisor = 0; for (int i = 0; i < n.length; i++) { int res = n[i] / divisor; System.out.println(res); } } catch (ArithmeticException e) { // Creating a new exception with // the original as the cause throw new RuntimeException ('Error: Division by zero occurred' e); } } }
výstup:
vybrat jako
Vysvětlení: V tomto příkladu pole celých čísel a nastaví dělitele na 0.
- Uvnitř bloku try se pokusí vydělit každý prvek pole 0, což vyvolá výjimku ArithmeticException.
- Tato výjimka ArithmeticException je zachycena v bloku catch, kde je vytvořena nová výjimka RuntimeException s původní výjimkou, tj. její příčinou je výjimka ArithmeticException.
- Protože není zachycena výjimka RuntimeException, která zobrazuje trasování zásobníku včetně výjimek RuntimeException a ArithmeticException.
Výhody zřetězených výjimek:
Výhody zřetězených výjimek jsou uvedeny níže:
- Tato výjimka pomáhá při ladění tím, že poskytuje podrobnosti o primárních i hlavních příčinách.
- Zjednodušuje zpracování chyb tím, že umožňuje šíření úplného kontextu výjimky.
- To zlepšuje sledovatelnost chyb ve složitých aplikacích.
Nevýhody zřetězených výjimek:
- Pokud se nepoužívá správně, může být stopa zásobníku delší a hůře čitelná.
- Nadměrné používání může způsobit matoucí chybové zprávy, pokud jsou výjimky zbytečně řetězeny.
- Vývojáři musí zajistit, aby smysluplné příčiny byly propojeny; jinak může být při ladění zavádějící.