|
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 блок, компилятор проверяет, что тип повторно брошенного исключения встречает следующие условия:
try блок в состоянии бросить это.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:
catch blocks that handles more than one exception type.