Как перехватить несколько исключений
Короткий ответ
Добавьте несколько блоков catch — выполнится первый подходящий:
void parseAndPrint(String[] parts, int index) {
try {
int value = Integer.parseInt(parts[index]);
IO.println("Value: " + value);
} catch (NumberFormatException e) {
IO.println("Not a number: " + parts[index]);
} catch (ArrayIndexOutOfBoundsException e) {
IO.println("No element " + index);
}
}
void main() {
String[] parts = {"10", "abc"};
parseAndPrint(parts, 0);
parseAndPrint(parts, 1);
parseAndPrint(parts, 5);
}Результат:
Value: 10
Not a number: abc
No element 5Одна обработка для нескольких типов
Если реакция одинаковая, перечислите типы через |:
void main() {
for (String input : List.of("42", "x", "")) {
try {
IO.println(100 / Integer.parseInt(input.isEmpty() ? "0" : input));
} catch (NumberFormatException | ArithmeticException e) {
IO.println("Bad input: " + e.getClass().getSimpleName());
}
}
}Результат:
2
Bad input: NumberFormatException
Bad input: ArithmeticExceptionПорядок блоков
Более конкретные исключения пишите раньше общих. Иначе компилятор сообщит, что блок недостижим:
void main() {
try {
Integer.parseInt("x");
} catch (Exception e) {
IO.println("general");
} catch (NumberFormatException e) {
IO.println("number");
}
}Результат:
Main.java:6: error: exception NumberFormatException has already been caughtfinally
Блок finally выполняется всегда — и после успешного кода, и после исключения:
void main() {
try {
IO.println("working");
throw new IllegalStateException("boom");
} catch (IllegalStateException e) {
IO.println("caught " + e.getMessage());
} finally {
IO.println("cleanup");
}
}Результат:
working
caught boom
cleanupЧастая ошибка
Перехватывать Exception и молча игнорировать. Ошибка исчезает, а программа продолжает работать с неверными данными:
void main() {
int total = 0;
for (String s : List.of("5", "five", "7")) {
try {
total += Integer.parseInt(s);
} catch (Exception e) {
}
}
IO.println(total);
}Результат:
12Как минимум запишите ошибку в журнал или сообщите пользователю, какие данные пропущены.
Функции из этого ответа
- try / catch / finally — Перехватывает исключения; finally выполняется всегда, а try с ресурсами сам их закрывает.