Excepțiile înlănțuite în Java permit asocierea unei excepții cu alta, adică o excepție descrie cauza unei alte excepții.
- De exemplu, luați în considerare o situație în care o metodă aruncă un ArithmeticException din cauza unei încercări de împărțire la zero.
- Dar cauza principală a erorii a fost o eroare I/O care a făcut ca divizorul să fie zero.
- În astfel de cazuri, excepțiile înlănțuite ajută la propagarea atât a cauzelor primare, cât și a celor subiacente ale erorii.
Exemplu : Următorul exemplu demonstrează cum să utilizați excepțiile înlănțuite în Java.
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()); } } }
Ieșire
Caught Exception: java.lang.NumberFormatException: Primary Exception Cause of Exception: java.lang.NullPointerException: Root cause of the exception
Nota: Excepțiile înlănțuite, cunoscute și ca excepții imbricate, ne permit să asociem o cauză cu o excepție în Java. Acest lucru este util atunci când dorim să transmitem informații despre cauza inițială a unei excepții.
Constructorii
- Aruncabil (cauza care poate fi aruncată) : Unde cauza este excepția care provoacă excepția curentă.
- Throwable(String msg Throwable cause) : unde msg este mesajul de excepție și cauza este excepția care provoacă excepția curentă.
Metode de aruncare susținând excepțiile înlănțuite
- getCause() : Această metodă returnează cauza reală a unei excepții.
- initCause(cauza care poate fi aruncată) : Această metodă stabilește cauza excepției de apelare.
Exemplu: Utilizarea unui mesaj personalizat cu excepții înlănțuite
În Java putem înlănțui excepții folosind constructorul clasei 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); } } }
Ieșire:
un exemplu de sistem open source este
Explicaţie: În acest exemplu, o matrice de numere întregi și setează divizorul la 0.
- În interiorul blocului try, încearcă să împartă fiecare element al matricei cu 0, ceea ce aruncă o excepție ArithmeticException.
- Această excepție ArithmeticException este prinsă în blocul catch unde este creată o nouă excepție RuntimeException cu excepția originală, adică ArithmeticException ca cauză.
- Deoarece RuntimeException nu este capturată, care afișează urmărirea stivei, inclusiv RuntimeException și ArithmeticException.
Avantajele excepțiilor înlănțuite:
Avantajele excepțiilor înlănțuite sunt enumerate mai jos:
- Această excepție ajută la depanare, oferind detalii atât despre cauzele primare, cât și despre cauzele principale.
- Simplifică gestionarea erorilor, permițând propagarea contextului complet de excepție.
- Acest lucru îmbunătățește trasabilitatea erorilor în aplicațiile complexe.
Dezavantajele excepțiilor înlănțuite:
- Dacă nu este utilizat în mod corespunzător, poate face trasarea stivei mai lungă și mai greu de citit.
- Utilizarea excesivă poate cauza mesaje de eroare confuze dacă excepțiile sunt înlănțuite în mod inutil.
- Dezvoltatorii trebuie să se asigure că cauzele semnificative sunt legate; altfel poate induce în eroare în timpul depanării.