Что представляет собой класс Exception в Java и какова его иерархия наследования?

Ответ

В Java java.lang.Exception — это базовый класс для всех checked (проверяемых) исключений. Он напрямую наследует от java.lang.Throwable.

Иерархия: ObjectThrowableException → ... (пользовательские checked-исключения, IOException, SQLException и т.д.)

Ключевые характеристики Exception:

  • Checked исключение: Компилятор требует обязательной обработки таких исключений либо через блок try-catch, либо через объявление в сигнатуре метода с помощью throws.
  • Предназначение: Обработка ожидаемых ошибок, от которых программа может восстановиться (например, отсутствие файла, проблемы с сетью, некорректный ввод).

Пример объявления класса Exception (упрощенно):

public class Exception extends Throwable {
    public Exception() {}
    public Exception(String message) { super(message); }
    public Exception(String message, Throwable cause) { super(message, cause); }
    // ... другие конструкторы и методы
}

Создание пользовательского checked-исключения:

// Наследуемся от Exception, чтобы создать проверяемое исключение
class ValidationException extends Exception {
    public ValidationException(String errorMessage) {
        super(errorMessage);
    }
}

// Использование
public void processUser(String name) throws ValidationException {
    if (name == null || name.isBlank()) {
        throw new ValidationException("Name cannot be empty");
    }
    // ... логика
}

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

Ответ 18+ 🔞

Слушай, а вот этот ваш java.lang.Exception — это ж, блядь, как бы сказать, главный по несчастьям, но по нормальным несчастьям. Не то чтобы он сам по себе часто летает, но он — этакий папаша, основатель целой династии проверяемых исключений, ёпта.

Представь себе такую хуйню: есть Throwable — дедушка всех проблем, и Error с Exception — его два сыночка. Так вот Error — это уже пиздец, типа OutOfMemoryError, тут уже не отловишь, конец близок. А Exception — это более культурный сынок, который говорит: «Э, дружок-пирожок, тут у нас проблемка, но ты можешь её предвидеть и как-то с ней договориться».

В чём прикол, блядь? А в том, что компилятор — тот ещё зануда — на него орать начинает, если ты его не обработаешь. Кинул Exception — либо лови его в try-catch, либо объявляй в сигнатуре метода через throws, типа «ребята, я тут могу такое выкинуть, вы там будьте готовы». Иначе не скомпилируется, в рот меня чих-пых!

А вот если взять его сынка — RuntimeException — то это уже отбитый подросток, unchecked-исключение. На него компилятору похуй, он не требует обязательной обработки. NullPointerException, IllegalArgumentException — все эти хулиганы оттуда. Но формально-то они всё равно в семье Exception числятся, парадокс, блядь!

Создать своё проверяемое исключение — проще пареной репы, ёбана: просто наследуйся от Exception. Вот смотри, какой мартышлюшка-код:

// Наследуемся от Exception, чтобы создать проверяемое исключение
class ValidationException extends Exception {
    public ValidationException(String errorMessage) {
        super(errorMessage);
    }
}

// Использование
public void processUser(String name) throws ValidationException {
    if (name == null || name.isBlank()) {
        throw new ValidationException("Name cannot be empty");
    }
    // ... логика
}

Вот и всё, блядь! Теперь кто будет вызывать processUser, тот либо в try-catch обернёт вызов, либо тоже в свой throws это ValidationException пропишет. Иначе — красные подчёркивания в IDE и чувство глубокого непонимания, почему код не собирается.

Короче, запомни: Exception — это для ожидаемых, «цивилизованных» ошибок, от которых можно отбиться. Не путай с его беспредельным сыном RuntimeException, на которого всем насрать, пока он не вломится тебе в рантайме прямо в ебало.