Наследуется ли RuntimeException от Exception в Java?

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

Ответ

Да. RuntimeException является прямым подклассом Exception.

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

Throwable
├── Error (непроверяемые, например, OutOfMemoryError)
└── Exception
    ├── IOException, SQLException и др. (проверяемые исключения)
    └── RuntimeException (непроверяемые исключения)
        ├── NullPointerException
        ├── IllegalArgumentException
        └── ...

Ключевое отличие — проверяемость (checked vs unchecked):

  • Exception (кроме RuntimeException): Проверяемые (checked). Компилятор требует их обработки через try-catch или объявления в throws.
    // Проверяемое исключение - требует обработки
    public void readFile() throws IOException {
        // код, который может выбросить IOException
    }
  • RuntimeException и его наследники: Непроверяемые (unchecked). Обработка не обязательна.
    // Непроверяемое исключение - обработка не требуется
    public void calculate(String str) {
        int length = str.length(); // Может выбросить NullPointerException
    }

    Почему так? RuntimeException обозначает ошибки программиста (например, обращение к null, неверный аргумент), которые часто невозможно осмысленно обработать в коде.