logo

Приєднані винятки в Java

Ланцюгові винятки в Java дозволяють асоціювати один виняток з іншим, тобто один виняток описує причину іншого винятку.

  • Наприклад, розглянемо ситуацію, коли метод викидає an ArithmeticException через спробу поділити на нуль.
  • Але основною причиною помилки була помилка введення-виведення, через яку дільник став нульовим.
  • У таких випадках ланцюгові винятки допомагають поширювати як основну, так і глибинну причини помилки.

приклад : наступний приклад демонструє, як використовувати ланцюгові винятки в 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());  }  } } 

Вихід
Caught Exception: java.lang.NumberFormatException: Primary Exception Cause of Exception: java.lang.NullPointerException: Root cause of the exception 

Примітка: Ланцюгові винятки, також відомі як вкладені винятки, дозволяють нам пов’язати причину з винятком у Java. Це корисно, коли ми хочемо поширити інформацію про початкову причину винятку.



Конструктори

  • Throwable (Throwable Причина) : Де причина — виняток, який викликає поточний виняток.
  • Throwable(String msg Throwable Причина) : де msg — це повідомлення про виняток, а причина — це виняток, який викликає поточний виняток.

Методи Throwable, що підтримують ланцюгові винятки

  1. getCause() : Цей метод повертає фактичну причину виняткової ситуації.
  2. initCause (можлива причина) : Цей метод встановлює причину виняткової ситуації виклику.

приклад: Використання спеціального повідомлення з приєднаними винятками

У Java ми можемо ланцюгувати винятки за допомогою конструктора класу 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);  }  } } 

Вихід:

рядок порожній
Вихід' title=

Пояснення: У цьому прикладі масив цілих чисел і встановлює дільник на 0.

  • Усередині блоку try він намагається розділити кожен елемент масиву на 0, що викликає ArithmeticException.
  • Ця виняткова ситуація ArithmeticException перехоплюється в блок catch, де створюється нова виняткова ситуація RuntimeException із початковою винятковою ситуацією, тобто ArithmeticException як її причина.
  • Оскільки RuntimeException не перехоплюється, відображається трасування стека, включаючи RuntimeException і ArithmeticException.

Переваги зв'язаних винятків:

Нижче наведено переваги зв’язаних винятків:

  • Цей виняток допомагає в налагодженні, надаючи докладні відомості про основні та основні причини.
  • Це спрощує обробку помилок, дозволяючи розповсюджувати повний контекст виняткової ситуації.
  • Це покращує відстеження помилок у складних програмах.

Недоліки ланцюгових винятків:

  • Якщо не використовувати належним чином, трасування стека може стати довшим і важчим для читання.
  • Надмірне використання може призвести до незрозумілих повідомлень про помилки, якщо винятки непотрібно зв’язуються.
  • Розробники повинні переконатися, що вагомі причини пов’язані між собою; інакше це може ввести в оману під час налагодження.