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.