Java. Класи для обробки виключних ситуацій з пакету java.lang. Методи класу Throwable. Приклади

Класи Java для обробки виключних ситуацій з пакету java.lang. Методи класу Throwable. Приклади


Зміст


1. Типи виключень, які підтримуються системою обробки виключень Java

У мові програмування Java розроблено ефективний механізм обробки виключень. В основі цього механізму лежать класи, що утворюють ієрархію. Для всіх класів виключень Java базовим класом є клас Throwable.

З класу Throwable успадковані два основні класи:

  • Exception – призначений для задавання виключних умов, що перехоплюються програмою. Якщо потрібно оголосити власний клас (тип) виключень, то цей клас має бути успадкований від класу Exception;
  • Error – клас, що призначений для опису виключень (помилок) які виникають в самому середовищі Java. Такі виключення не обумовлюються під час нормального виконання прикладної програми. Приклади системних помилок: недостатньо пам’яті, переповнення стеку.

Схема верхнього рівня ієрархії класів Java наведена на рисунку

Java. Вершина ієрархії класів виключень

Рисунок. Вершина ієрархії класів виключень Java

 

2. Класифікація виключень за ознакою наявності в операторі throws. Виключення які не перевіряються. Виключення які перевіряються

Як відомо, метод може генерувати виключення, які можуть бути перехоплені в інших методах вищих рівнів. При цьому, метод повинен вказувати перелік оброблюваних виключень в операторі throws.

Більш детально про роботу оператора throws описується в темі:

Якщо тип згенерованого виключення є підкласом стандартного класу RuntimeException, то не обов’язково вказувати цей тип в переліку оператора throws методу. Таке виключення називається виключенням, що не перевіряється. У цьому випадку компілятор не перевіряє обробляються чи генеруються такі виключення в деякому місці програми.

Якщо тип згенерованого виключення не є підкласом стандартного класу RuntimeException, то це виключення називається виключення, що перевіряється. У випадку генерування такого типу виключення, його потрібно обов’язково включати в оператор throws.

 

3. Перелік підкласів виключень, що неперевіряються з пакету java.lang

Серед усього різномаїття класів та інтерфейсів пакет java.lang містить потужний арсенал класів для обробки виключень. Ці класи та інтерфейси складають основу всіх програм на Java. Пакет java.lang автоматично імпортується у всі програми.

Нижче наведено перелік підкласів виключень, що не перевіряються і є похідними від класу RuntimeException і які визначені в пакеті java.lang:

  • ArithmeticException – арифметична помилка (наприклад, ділення на нуль);
  • ArrayIndexOutOfBoundsException – індекс за межами масиву;
  • ArrayStoreException – присвоювання елементу масиву об’єкту несумісного типу;
  • ClassCastException – неправильне приведення типів;
  • EnumConstantNotPresent – спроба скористатись невизначеним значенням зчислення;
  • IllegalArgumentException – недопустимий аргумент при виклику методу;
  • IllegalMonitorStateException – недопустима контрольна операція;
  • IllegalStateException – невірний стан середовища чи додатку;
  • IllegalThreadStateException – несумісність запитуваної операції з поточним станом потоку виконання;
  • IndexOutOfBoundsException – вихід індексу деякого типу за допустимі межі;
  • NegativeArraySizeException – створення масиву від’ємного (негативного) розміру;
  • NullPointerException – неправильне використання пустого посилання;
  • NumberFormatException – неправильне перетворення символьного рядка в числовий формат;
  • SecurityException – спроба порушення безпеки;
  • StringIndexOutOfBounds – спроба доступу за індексом за межами символьного рядка;
  • TypeNotPresentException – не знайдено тип;
  • UnsupportedOperationException – знайдена непідтримувана операція.

 

4. Виключення що перевіряються з пакету java.lang

Якщо тип згенерованого виключення не є підкласом стандартного класу RuntimeException, то це виключення називається виключення, що перевіряється. У випадку генерування такого типу виключення, його обов’язково включати в оператор throws.

У мові Java в пакеті java.lang реалізовано ряд виключень, що перевіряються. Нижче наведено їх перелік:

  • ClassNotFoundException – клас не знайдено;
  • CloneNotSupportedException – спроба клонувати об’єкт з класу, що не реалізує інтерфейс Cloneable;
  • IllegalAccessException – заборонено доступ до класу;
  • InstantiationException – спроба створити об’єкт абстрактного класу чи інтерфейсу;
  • InterruptedException – один потік виконання перерваний іншим потоком;
  • NoSuchFieldException – запитуване поле не існує;
  • NoSuchMethodException – запитуваний метод не існує;
  • ReflectiveOperationException – суперклас виключень, зв’язаних з рефлексією.

Також, в перелік виключень оператора throws обов’язково потрібно включати власноруч розроблені класи виключень для їх перевірки.



 

5. Яке призначення класу Throwable? Методи класу Throwable

Клас Throwable є базовим для усіх стандартних класів виключень Java. Цей клас надає ряд методів, які можна використовувати або перевизначати у власних класах обробки виключень. Ці класи повинні бути успадковані від класу Exception, який успадкований від класу Throwable (див. рисунок). Клас Exception не містить методів.
Нижче наведено перелік методів класу Throwable.

1. Метод

final void addSuppressed(Throwable виключення)

додає задане виключення в список виключень що подавляються. Цей список зв’язується з викликаючим (даним) виключенням. Метод використовується для застосування в операторі try з ресурсами.

2. Метод

Throwable fillInStackTrace()

повертає об’єкт класу Throwable, що містить повне трасування стеку. Цей об’єкт може бути згенерований повторно.

3. Метод

Throwable getCause()

повертає виключення, що лежить в основі поточного виключення. Метод повертає null у випадку, якщо таке виключення відсутнє. Цей метод використовується при створенні ланцюжків виключень – він викликає виключення, яке викликає поточне виключення.

4. Метод

String getLocalizedMessage()

повертає локалізований опис виключення.

5. Метод

String getMessage()

повертає опис виключення.

6. Метод

StackTraceElement[] getStackTrace()

повертає масив, що містить поелементне трасування стеку у вигляді об’єктів класу StackTraceElement.

7. Метод

final Throwable[] getSuppressed()

отримує подавлені виключення, пов’язані з викликаючим виключенням, і повертає масив, що містить результат. Подавлені виключення генеруються в операторі try з ресурсами.

8. Метод

Throwable initCause(Throwable причина_виключення)

зв’язує вхідний параметр причина_виключення з викликаючим виключенням, вказуючи його як причину цього викликаючого виключення. Повертає посилання на виключення. Метод використовується для створення ланцюжків виключень.

9. Метод

printStackTrace();

виводить трасування стеку.

10. Метод printStackTrace() має ще дві перевантажені реалізації

void printStackTrace(PrintStream потік_виведення)
void printStackTrace(PrintWriter потік_виведення)

Метод направляє трасування стеку в заданий потік_виведення.

11. Метод

void setStackTrace(StackTraceElement елементи[])

встановлює трасування стеку для заданих елементів.

12. Метод

String toString()

повертає об’єкт типу String, що містить опис виключення. Цей метод можна викликати з методу println() при виведенні об’єкту типу Throwable.

 

6. Приклад використання деяких методів класу Throwable. Розробка власного класу виключення

У прикладі демонструється використання деяких методів класу Throwable:

  • getLocalizedMessage();
  • getMessage();
  • toString();
  • getStackTrace();
  • fillInStackTrace().

Оголошується клас MyException, що успадкований від класу Exception. В ієрархії класів виключень Java клас Exception є успадкований від класу Throwable. Тому, клас MyException може використовувати та перевизначати методи класу Throwable.

Текст програми наступний:

import java.util.Scanner;

// власний клас виключення, успадкований від Exception
class MyException extends Exception
{
  // перевизначена функція getLocalizedMessage()
  public String getLocalizedMessage()
  {
    return "MyException.getLocalizedMessage()";
  }
}

// клас, що містить функцію main()
public class Train04 {
  // функція main() тестує роботу класу Exception
  public static void main(String[] args) {
    // Ввести число x. Якщо число за межами [0..100],
    // то згенерувати виключення MyException
    int x;
    Scanner sc = new Scanner(System.in);
    System.out.print("x = ");

    x = sc.nextInt(); // ввести x

    try {
      // згенерувати виключення (створити об'єкт типу MyException),
      // якщо x за межами [0..100]
      if ((x<0)||(x>100))
        throw new MyException();
      System.out.println("OK!");
    }
    catch(MyException e)
    {
      // обробка виключення типу MyException,
      // демонстрація деяких методів класу Throwable
      System.out.println("Return from getLocalizedMessage(): " + e.getLocalizedMessage());
      System.out.println("Return from getMessage(): " + e.getMessage());
      System.out.println("Method printStackTrace(): ");
      e.printStackTrace();
      System.out.println("Method toString(): " + e.toString());

      System.out.println("------------------------");
      System.out.println("Method getStackTrace(). Stack trace: ");
      StackTraceElement[] stE;

      stE = e.getStackTrace(); // метод getStackTrace()

      for (int i=0;i<stE.length;i++)
        System.out.println(stE[i].toString());

      System.out.println("-------------------------");
      System.out.println("Method fillStackTrace(). Stack trace: ");

      Throwable tA = e.fillInStackTrace();
      StackTraceElement[] stE2 = tA.getStackTrace();

      for (int i=0; i<stE2.length; i++)
        System.out.println(stE[i].toString());
      System.out.println("-------------------------");
    }
  }
}

Пояснимо деякі фрагменти коду.

З метою демонстрації в класі MyException перевизначається метод getLocalizedMessage(). При виклику цього методу, виводиться повідомлення з перевизначеного методу класу MyException. За даним прикладом можна перевизначати інші методи класу Throwable.

У функції main() продемонстровано застосування методів класу Throwable. Вводиться змінна x, яка перевіряється на допустимі значення в межах від 0 до 100. Якщо значення x менше 0 або більше 100, то генерується виключення типу MyException.

Результат роботи програми

x = 200
Return from getLocalizedMessage(): MyException.getLocalizedMessage()
Return from getMessage(): null
Method printStackTrace():
Method toString(): MyException: MyException.getLocalizedMessage()
------------------------
Method getStackTrace(). Stack trace:
Train04.main(Train04.java:36)
-------------------------
Method fillStackTrace(). Stack trace:
Train04.main(Train04.java:36)
-------------------------
MyException: MyException.getLocalizedMessage()

 


Зв’язані теми