Что означает наследование от класса Exception в Java?

«Что означает наследование от класса Exception в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Наследование от java.lang.Exception создает проверяемое исключение (checked exception).

Особенности проверяемых исключений:

  • Компилятор требует их обработки.
  • Метод должен либо объявить такое исключение в throws-клаузе, либо обработать его в блоке try-catch.
  • Используются для ошибок, от которых программа может разумно восстановиться (например, FileNotFoundException, SQLException).

Пример создания пользовательского проверяемого исключения:

// 1. Объявление исключения.
class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

// 2. Использование в методе.
class BankAccount {
    void withdraw(double amount) throws InsufficientFundsException {
        if (amount > balance) {
            throw new InsufficientFundsException("Недостаточно средств.");
        }
        balance -= amount;
    }
}

// 3. Обработка исключения (обязательна).
public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount();
        try {
            account.withdraw(1000);
        } catch (InsufficientFundsException e) {
            System.err.println("Ошибка: " + e.getMessage());
            // Логика восстановления: предложить другую сумму.
        }
    }
}

Важное отличие: Класс RuntimeException (и все его наследники, например, NullPointerException) также наследуется от Exception, но представляет непроверяемые исключения. Их обработка компилятором не требуется.