Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как перехватить несколько исключений

Короткий ответ

Добавьте несколько блоков 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 caught

finally

Блок 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 с ресурсами сам их закрывает.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.