Глиф Учебники

Исключения: try и catch

Справочник · Java · 2 минуты чтения

Исключение (exception) — сигнал об ошибке во время работы программы: деление на ноль, строка вместо числа, нет файла. Если его не обработать, программа останавливается и печатает сообщение об ошибке. Обработать — значит поймать исключение в блоке catch и решить, что делать дальше.

Java
public class Main {
    public static void main(String[] args) {
        String[] inputs = {"10", "abc", "0"};
        for (String s : inputs) {
            try {
                int n = Integer.parseInt(s);
                System.out.println("100 / " + n + " = " + (100 / n));
            } catch (NumberFormatException e) {
                System.out.println("Не число: " + s);
            } catch (ArithmeticException e) {
                System.out.println("Делить на ноль нельзя");
            } finally {
                System.out.println("---");
            }
        }
    }
}
Вывод
100 / 10 = 10
---
Не число: abc
---
Делить на ноль нельзя
---

Целочисленное деление на ноль бросает ArithmeticException, а у дробных чисел ошибки нет: 1.0 / 0 даёт Infinity.

Что внутри исключения

Java
try {
    Integer.parseInt("abc");
} catch (NumberFormatException e) {
    System.out.println(e.getMessage());
}

e.getMessage() возвращает текст ошибки — здесь For input string: "abc". e.printStackTrace() печатает полное сообщение со списком строк, через которые прошла ошибка, — удобно при отладке.

Проверяемые и непроверяемые

Java
static String firstLine(String path) throws IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
        return reader.readLine();
    }
}

throws IOException передаёт исключение тому, кто вызвал метод. Конструкция try (…) — try с ресурсами: открытое в скобках закроется само, даже при ошибке, и finally для этого не нужен. Нужны импорты java.io.*.

Своё исключение: throw

Метод может сам сообщить об ошибке словом throw:

Java
static void setAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("Возраст не может быть отрицательным: " + age);
    }
}

IllegalArgumentException — стандартное исключение для неверного аргумента. После throw метод сразу прекращается, а исключение летит к вызвавшему коду — пока его не поймает какой-нибудь catch.

Подводные камни