← Назад к вопросам

Какое исключение нужно написать после throws, чтобы вызывающий метод его обязательно обработал?

1.0 Junior🔥 171 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проверяемые исключения (Checked Exceptions)

Что такое проверяемые исключения?

Чтобы вызывающий метод был обязан обработать исключение, нужно указать после ключевого слова throws проверяемое исключение (Checked Exception). Проверяемые исключения — это исключения, наследующиеся от класса java.lang.Exception, но не от java.lang.RuntimeException. Компилятор Java проверяет (hence the name) наличие обработки этих исключений.

Иерархия исключений

В Java существует две основные категории исключений:

  • Checked Exceptions: Наследуют Exception (но не RuntimeException). Обязательна обработка через try-catch или throw
  • Unchecked Exceptions (Runtime Exceptions): Наследуют RuntimeException. Обработка опциональна

Примеры проверяемых исключений

Стандартные проверяемые исключения из Java:

// IOException — самое частое проверяемое исключение
public void readFile(String filename) throws IOException {
    FileInputStream fis = new FileInputStream(filename);
    // Код для чтения файла
}

// SQLException — исключение при работе с БД
public void queryDatabase() throws SQLException {
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db");
    // Код запроса
}

// ClassNotFoundException — когда класс не найден
public void loadClass() throws ClassNotFoundException {
    Class.forName("com.example.MyClass");
}

// InterruptedException — при прерывании потока
public void sleepThread() throws InterruptedException {
    Thread.sleep(1000);
}

Обязательная обработка

Вызывающий метод должен либо перехватить исключение, либо переклассифицировать его:

// Вариант 1: Перехват исключения (try-catch)
public void caller() {
    try {
        readFile("data.txt");
    } catch (IOException e) {
        System.out.println("Ошибка при чтении файла: " + e.getMessage());
    }
}

// Вариант 2: Переклассификация (throws)
public void caller() throws IOException {
    readFile("data.txt");
}

Множественные исключения

Метод может выбросить несколько разных проверяемых исключений:

public void complexOperation() throws IOException, SQLException, ClassNotFoundException {
    readFile("data.txt");
    queryDatabase();
    loadClass();
}

// Или более лаконично — общее суперклассное исключение:
public void complexOperation() throws Exception {
    readFile("data.txt");
    queryDatabase();
    loadClass();
}

Отличие от unchecked исключений

Для unchecked исключений (RuntimeException) обработка не требуется:

// Не требуется throws для unchecked исключений
public void divide(int a, int b) {
    // ArithmeticException — это RuntimeException, можно не указывать в throws
    System.out.println(a / b);
}

// Даже если указать — это просто информативно, не обязательно
public void divide(int a, int b) throws ArithmeticException {
    System.out.println(a / b);
}

Практические рекомендации

  1. Используй проверяемые исключения для ожидаемых ошибок, которые вызывающий код должен обработать (I/O ошибки, сетевые проблемы)
  2. Используй unchecked исключения для программных ошибок, которые указывают на баги (NullPointerException, IndexOutOfBoundsException)
  3. Не игнорируй проверяемые исключения — если метод объявляет throws, обязательно обработай их
  4. Создавай собственные checked исключения для специфичных ошибок бизнес-логики

Собственное проверяемое исключение

public class InvalidAgeException extends Exception {
    public InvalidAgeException(String message) {
        super(message);
    }
}

public void setAge(int age) throws InvalidAgeException {
    if (age < 0 || age > 150) {
        throw new InvalidAgeException("Возраст должен быть от 0 до 150");
    }
}

Итак, ответ: нужно указать проверяемое исключение (Checked Exception), которое наследует Exception, но не RuntimeException. Компилятор обязательно проверит, что вызывающий код его обработал.

Какое исключение нужно написать после throws, чтобы вызывающий метод его обязательно обработал? | PrepBro