Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Ловля Многократных Типов Исключения и Перебросок Исключений с Улучшенной Проверкой Типа

Эта страница затрагивает следующие темы:

Обработка больше чем Одного Типа Исключения

В Java SE 7 и позже, сингл catch блок может обработать больше чем один тип исключения. Эта функция может уменьшить дублирование кода и уменьшить искушение поймать чрезмерно широкое исключение.

Рассмотрите следующий пример, который содержит дублирующий код в каждом из catch блоки:

catch (IOException ex) {
     logger.log(ex);
     throw ex;
catch (SQLException ex) {
     logger.log(ex);
     throw ex;
}

В выпусках до Java SE 7, трудно создать общепринятую методику, чтобы устранить дублированный код потому что переменная ex имеет различные типы.

Следующий пример, который допустим в Java SE 7 и позже, устраняет дублированный код:

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

catch пункт определяет типы исключений, которые может обработать блок, и каждый тип исключения разделяется вертикальной панелью (|).

Отметьте: Если a catch блокируйте обрабатывает больше чем один тип исключения, тогда catch параметр неявно final. В этом примере, catch параметр ex final и поэтому невозможно присвоить значения этому в пределах catch блок.

Байт-код, сгенерированный, компилируя a catch блок, который обрабатывает многократные типы исключения, будет меньшим (и таким образом выше) чем компиляция многих catch блоки, которые обрабатывают только одно исключение, вводят каждого. A catch блок, который обрабатывает многократные типы исключения, не создает дублирования в байт-коде, сгенерированном компилятором; у байт-кода нет никакой репликации обработчиков исключений.

Перебросок Исключений с Более Содержащей Проверкой Типа

Java SE 7 компиляторов выполняет более точный анализ повторно брошенных исключений чем более ранние выпуски Java SE. Это позволяет Вам определить, что более определенное исключение вводит throws пункт объявления метода.

Рассмотрите следующий пример:

  static class FirstException extends Exception { }
  static class SecondException extends Exception { }

  public void rethrowException(String exceptionName) throws Exception {
    try {
      if (exceptionName.equals("First")) {
        throw new FirstException();
      } else {
        throw new SecondException();
      }
    } catch (Exception e) {
      throw e;
    }
  }

Это примеры try блок мог бросить также FirstException или SecondException. Предположите, что Вы хотите определить их, исключение вводит throws пункт rethrowException объявление метода. В выпусках до Java SE 7, невозможно сделать так. Поскольку параметр исключения catch пункт, e, тип Exception, и блок выгоды повторно бросает параметр исключения e, можно только определить тип исключения Exception в throws пункт rethrowException объявление метода.

Однако, в Java SE 7, можно определить типы исключения FirstException и SecondException в throws пункт в rethrowException объявление метода. Java SE 7 компиляторов может решить что исключение, выданное оператором throw e должно быть, прибыл из try блок, и единственные исключения, выданные try блок может быть FirstException и SecondException. Даже при том, что параметр исключения catch пункт, e, тип Exception, компилятор может решить, что это - экземпляр также FirstException или SecondException:

  public void rethrowException(String exceptionName)
  throws FirstException, SecondException {
    try {
      // ...
    }
    catch (Exception e) {
      throw e;
    }
  }

Этот анализ отключается если catch параметр присваивается другому значению в catch блок. Однако, если параметр выгоды присваивается другому значению, следует определить тип исключения Exception в throws пункт объявления метода.

Подробно, в Java SE 7 и позже, когда Вы объявляете, одно или более исключений вводят a catch пункт, и перебросок исключение обрабатываются этим catch блок, компилятор проверяет, что тип повторно брошенного исключения встречает следующие условия:

Java SE 7 компиляторов позволяет Вам определять типы исключения FirstException и SecondException в throws пункт в rethrowException объявление метода, потому что можно повторно бросить исключение, которое является супертипом любого из типов, объявленных в throws.

В выпусках до Java SE 7, невозможно выдать исключение, которое является супертипом одного из catch параметры исключения пункта. Компилятор от выпуска до Java SE 7 генерирует ошибку, "исключение, о котором несообщают, Exception; должен быть пойман или, как объявлять, бросается" в оператор throw e. Компилятор проверяет, присваиваем ли тип выданного исключения какому-либо из типов, объявленных в throws пункт rethrowException объявление метода. Однако, тип параметра выгоды e Exception, который является супертипом, не подтипом, FirstException иSecondException.

If one or more exception types are declared in a catch parameter, and the exception handled by this catch block is not reassigned, then these exception types are implicitly final. You may explicitly declare these exception types as final; however this is not necessary:

catch (final IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

Exception types that are not final (in particular, catch blocks in which the handled exception is reassigned) affect the features discussed on this page as follows:

-->

Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами