От какого базового класса наследуются все исключения в Java?

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

Ответ

Все исключения и ошибки в Java являются наследниками класса java.lang.Throwable. Это корневой класс всей иерархии.

Структура наследования:

            Throwable
            /        
       Error        Exception
                    /         
    RuntimeException    Проверяемые исключения (Checked)
                        (IOException, SQLException и др.)

Ключевые ветви:

  1. Error: Непроверяемые (unchecked) критические ошибки, которые обычно указывают на проблемы среды выполнения JVM (например, OutOfMemoryError, StackOverflowError). Их, как правило, не следует обрабатывать.
  2. Exception: Базовый класс для большинства исключительных ситуаций в приложении.
    • RuntimeException и его наследники: Непроверяемые исключения (unchecked), возникающие из-за логических ошибок в коде (например, NullPointerException, IllegalArgumentException). Компилятор не требует их обязательного объявления или обработки.
    • Проверяемые исключения (Checked): Все остальные наследники Exception. Компилятор требует либо обработать их в блоке try-catch, либо объявить в сигнатуре метода с помощью throws.

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

// Проверяемое исключение
class ValidationException extends Exception {
    public ValidationException(String message) {
        super(message);
    }
}

// Непроверяемое исключение
class BusinessLogicException extends RuntimeException {
    public BusinessLogicException(String message) {
        super(message);
    }
}