Java Урок 44: ИСКЛЮЧЕНИЯ, throws, throw, собственные исключения

До сих пор мы перехватывали только те исключения, которые передавала Java. Однако существует возможность передавать исключения из ваших программ явным образом, используя оператор throw.

Скачать исходники для статьи можно ниже

Его общая форма показана ниже.

throw экземпляр_Throwablе;

Здесь экземпляр_Тhrowablе должен быть объектом класса Throwable либо
подклассом класса Throwable.

Существует два способа получить объект класса Throwable: с использованием параметра в операторе catch либо за счет создания объекта оператором new.

Поток выполнения останавливается непосредственно после оператора
throw — любые последующие операторы не выполняются.
Обнаруживается ближайший закрытый блок try, имеющий оператор catch соответствующего исключению типа.
Если соответствие найдено, управление передается этому оператору.
Если же нет, проверяется следующий внешний блок tгу и т.д.
Если не находится подходящего по типу оператора catch, то стандартный обработчик исключений прерывает программу и выводит трассировку стека.

Ниже приведен пример программы, создающей и передающей исключение.
Обработчик, который перехватывает его, повторно передает его для внешнего обработчика.

// Демонстрация применения throw
class ThrowDemo {
   static void demoproc() {
      try {
         throw new NullPointerException("demo");
      } catch(NullPointerException e) {
         System.out.println("Перехвачено внутри demoproc.");
         throw e; // повторно передать исключение
      }
   }
   public static void main(String args[]) {
      try {
         demoproc();
      } catch (NullPomterException e) {
         System.out.println("Повторный перехват: " + e);
      }
   }
}

Вывод этой программы:
Перехвачено внутри demoproc.
Повторный перехват: java.lang.NullPointerException: demo

Эта программа получает две возможности обработки одной и той же ошибки.
Сначала метод main() устанавливает контекст исключения, затем вызывает метод demoproc(), который устанавливает другой контекст обработки исключения и немедленно передает новый экземпляр исключения Null PointerException, который перехватывается в следующей строке. Затем исключение передается повторно.

Эта программа также демонстрирует, как создавать собственные объекты
стандартных исключений Java. Обратите внимание на следующую строку.

throw new NullPointerException("demo");

Здесь оператор new используется для создания экземпляра исключения Null-PointerException.

Оператор throws.

Если метод может породить исключение, которое он сам не обрабатывает, он должен задать это поведение так, чтобы вызывающий его код мог позаботиться об этом исключении.
Для этого к объявлению метода добавляется конструкция throws. Конструкция throws перечисляет типы исключений, которые метод
может передавать. Все остальные исключения, которые может передавать
метод, должны быть объявлены в конструкции throws. Если этого не сделать, получится ошибка во время компиляции.
Вот общая форма объявления метода, которая включает оператор throws.

тип имя_метода (список_параметров) throws список_исключений
{
   // тело метода
}

Здесь список_исключений — это разделенный запятыми список исключений,
которые метод может передать.

Ниже представлен пример неправильной программы, пытающейся передать исключение, которое сама она не перехватывает. Поскольку в программе не указан оператор throws для отображения этого факта, такая программа не компилируется.

// Эта программа содержит ошибку и потому не компилируется,
class ThrowsDemo {
   static void throwOne() {
      System.out.println("Внутри throwOne.");
      throw new IllegalAccessException("демо");
   }
   public static void main(String args[]) {
      throwOne();
   }
}

Чтобы откомпилировать этот пример, нужно внести в него два изменения.
Во-первых, следует объявить, что метод throwOne() передает исключение
IllegalAccessException.
Во-вторых, метод main() должен определять блок try/catch, который перехватит это исключение.

Исправленный пример выглядит следующим образом:

// Теперь код корректен
class ThrowsDemo {
   static void throwOne() throws IllegalAccessException {
      System.out.println("Внутри throwOne.");
      throw new IllegalAccessException("demo");
   }
   public static void main(String args[]) {
      try {
         throwOne();
      } catch (IllegalAccessException e) {
         System.out.println("Перехвачено " + e);
      }   }
}

Вот результат, полученный при запуске этой программы:
Внутри throwOne
Перехвачено java.lang.IllegalAccessException: demo

Введите свой email адрес для того, чтобы подписаться на мой блог:


knopkisoc

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *