Ответ
Да, можно. Блок try может иметь несколько блоков catch для обработки исключений разных типов. Обработчики проверяются сверху вниз, поэтому порядок важен.
Пример:
try {
// Код, который может выбросить разные исключения
FileInputStream file = new FileInputStream("missing.txt"); // Может выбросить FileNotFoundException
int[] array = new int[5];
array[10] = 42; // Выбросит ArrayIndexOutOfBoundsException
} catch (FileNotFoundException e) {
System.err.println("Файл не найден: " + e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Ошибка индекса массива: " + e.getMessage());
} catch (Exception e) {
// Общий обработчик для всех остальных исключений
System.err.println("Произошла непредвиденная ошибка: " + e.getMessage());
}
Важные правила:
- Специфичность прежде всего: Более конкретные исключения (например,
FileNotFoundException) должны быть выше более общих (например,IOExceptionилиException). - Недостижимый код: Компилятор выдаст ошибку, если более общее исключение будет перехватываться раньше более конкретного.
- Multi-catch (Java 7+): Можно перехватывать несколько типов исключений в одном блоке
catch.catch (FileNotFoundException | SQLException e) { // Обработка двух разных, но не связанных наследованием, исключений }