В Java 7 блок catch был улучшен для обработки нескольких исключений в одном блоке catch. Если вы перехватываете несколько исключений и у них схожий код, использование этой функции позволит уменьшить дублирование кода. Давайте разберем функцию перехвата нескольких исключений в Java на примере.
Перехват нескольких исключений в Java
До Java 7 мы перехватывали несколько исключений поочередно, как показано ниже.
catch (IOException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
catch (SQLException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}
В Java 7 мы можем перехватывать оба этих исключения в одном блоке catch следующим образом:
catch(IOException | SQLException ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}
Если блок catch обрабатывает несколько исключений, вы можете разделять их с использованием символа “pipe” (|), и в этом случае параметр исключения (ex) является финальным, поэтому вы не можете его изменить. Байт-код, генерируемый этой функцией, является более компактным и уменьшает избыточность кода.
Перехват исключения в Java
Еще одно улучшение связано с анализом компилятора перебрасываемых исключений. В Java переброс исключения позволяет указывать более конкретные типы исключений в разделе throws при объявлении метода. Давайте рассмотрим это на небольшом примере:
package com.journaldev.util;
public class Java7MultipleExceptions {
public static void main(String[] args) {
try{
rethrow("abc");
}catch(FirstException | SecondException | ThirdException e){
//ниже приведенное присваивание вызовет исключение времени компиляции, так как e является финальным
//e = new Exception();
System.out.println(e.getMessage());
}
}
static void rethrow(String s) throws FirstException, SecondException,
ThirdException {
try {
if (s.equals("First"))
throw new FirstException("First");
else if (s.equals("Second"))
throw new SecondException("Second");
else
throw new ThirdException("Third");
} catch (Exception e) {
//ниже приведенное присваивание отключает улучшенную проверку типа исключения при повторном выбрасывании функции Java 7
// e=new ThirdException();
throw e;
}
}
static class FirstException extends Exception {
public FirstException(String msg) {
super(msg);
}
}
static class SecondException extends Exception {
public SecondException(String msg) {
super(msg);
}
}
static class ThirdException extends Exception {
public ThirdException(String msg) {
super(msg);
}
}
}
Как видно в методе rethrow
, блок catch перехватывает исключение, но это не часть списка throws. Компилятор Java 7 анализирует полный блок try, чтобы проверить, какие типы исключений выбрасываются, а затем повторно выбрасываются из блока catch. Обратите внимание, что этот анализ отключается, если изменить аргумент блока catch. Дополнительное чтение: Обработка исключений в Java.
Source:
https://www.digitalocean.com/community/tutorials/java-catch-multiple-exceptions-rethrow-exception