Множественный catch
Множественный catch (multi-catch) - это механизм,
позволяющий в одном блоке catch обрабатывать
сразу несколько типов исключений. Вместо того чтобы
писать отдельный блок catch для каждого типа,
мы указываем их через вертикальную черту |.
Переменная, в которую попадает исключение, при этом
является неявно финальной (final), то есть её нельзя
переприсвоить внутри блока. Это удобно, когда разные
исключения требуют одинаковой обработки.
Синтаксис
try
{
// код, который может выбросить исключение
}
catch (ExceptionType1 | ExceptionType2 | ExceptionType3 e)
{
// общая обработка для всех указанных типов
}
Пример
Давайте перехватим два разных исключения в одном
блоке catch - деление на ноль и выход за
границы массива:
public class Main
{
public static void main(String[] args)
{
try
{
int[] arr = {1, 2, 3};
int res = arr[5] / 0;
}
catch (ArithmeticException | ArrayIndexOutOfBoundsException e)
{
System.out.println("Caught: " + e.getClass().getSimpleName());
}
}
}
Результат выполнения кода:
"Caught: ArrayIndexOutOfBoundsException"
Пример
Давайте перехватим несколько unchecked-исключений и выведем их сообщения:
public class Main
{
public static void main(String[] args)
{
try
{
String str = "12345";
int num = Integer.parseInt("abcde");
}
catch (NumberFormatException | NullPointerException | IllegalStateException e)
{
System.out.println(e.getMessage());
}
}
}
Результат выполнения кода:
"For input string: \"abcde\""
Пример
Давайте покажем, что переменная в multi-catch является неявно финальной - попытка её переприсвоить вызовет ошибку компиляции:
public class Main
{
public static void main(String[] args)
{
try
{
int res = 1 / 0;
}
catch (ArithmeticException | RuntimeException e)
{
// e = new RuntimeException(); // ошибка компиляции
System.out.println("Handled");
}
}
}
Результат выполнения кода:
"Handled"