Что такое unchecked исключение (runtime exception) в Java?

Ответ

Unchecked исключения (непроверяемые) — это исключения, унаследованные от RuntimeException. Компилятор не требует их явного объявления в throws или обработки в try-catch. Они обычно указывают на ошибки программиста или сбои в работе JVM.

Характеристики:

  • Не проверяются на этапе компиляции.
  • Наследуются от java.lang.RuntimeException.
  • Представляют ошибки логики: доступ по индексу за пределами массива (ArrayIndexOutOfBoundsException), обращение к null (NullPointerException), неверный аргумент (IllegalArgumentException).

Пример:

public class UncheckedExample {
    public int divide(int a, int b) {
        // ArithmeticException (деление на ноль) — unchecked.
        // Компилятор не заставит вас обработать этот случай.
        return a / b;
    }

    public static void main(String[] args) {
        UncheckedExample example = new UncheckedExample();
        example.divide(10, 0); // Выбросит ArithmeticException во время выполнения.
    }
}
Сравнение с checked исключениями: Критерий Checked исключения Unchecked исключения (Runtime)
Наследование От Exception (но не от RuntimeException) От RuntimeException
Обработка Обязательна (try-catch или throws) Не обязательна
Тип ошибки Внешние, recoverable (например, IOException) Внутренние, логические, часто unrecoverable

Best practice: Предотвращайте unchecked исключения с помощью валидации входных данных и соблюдения контрактов методов, а не полагайтесь на их обработку.

Ответ 18+ 🔞

А, ну вот, подъехали к самому интересному, к unchecked исключениям! Это ж, блядь, как та самая собака Муму — вроде тихая, а потом херак — и ты уже в озере с мешком на шее.

Смотри, unchecked исключения — это те, которые наследуются от RuntimeException. И главная их фишка в чём, ёпта? Компилятор, этот старый пердун, на них забивает болт. Он не будет орать на тебя, что ты их не объявил в throws и не обернул в try-catch. Всё как есть — полная свобода, ага, до первого пиздеца.

Что это за звери такие?

  • Компилятор их не проверяет. Отсюда и название — unchecked. Живут своей жизнью.
  • Папочка у нихjava.lang.RuntimeException.
  • А означают они обычно, что ты, дружок-пирожок, где-то накосячил по логике. Нулевой указатель ловишь (NullPointerException)? Массив за пределы полез (ArrayIndexOutOfBoundsException)? На ноль поделил (ArithmeticException)? Да это же твои ручонки кривые, блядь! Это не система отказала, это ты, сука, программист, облажался.

Вот, смотри, пример, как это выглядит в коде:

public class UncheckedExample {
    public int divide(int a, int b) {
        // ArithmeticException (деление на ноль) — unchecked.
        // Компилятор не заставит вас обработать этот случай.
        return a / b;
    }

    public static void main(String[] args) {
        UncheckedExample example = new UncheckedExample();
        example.divide(10, 0); // Выбросит ArithmeticException во время выполнения.
    }
}

Видишь? Метод divide спокоен, как удав. Никаких throws, никаких try. А потом — бац! — запускаешь, передаёшь ноль, и получаешь ArithmeticException прямо в ебало, во время выполнения. Вот тебе и вся свобода, ебать мои старые костыли.

А теперь, чтобы совсем не запутаться, глянь на разницу с checked исключениями:

Критерий Checked исключения Unchecked исключения (Runtime)
Наследование От Exception (но не от RuntimeException) От RuntimeException
Обработка Обязательна (try-catch или throws) Не обязательна
Тип ошибки Внешние, recoverable (например, IOException) Внутренние, логические, часто unrecoverable

И главный совет, который стоит вытатуировать на жопе: не надейся на обработку unchecked исключений! Это как надеяться, что Герасим передумает топить Муму — нихуя. Лучше их предотвращай: проверяй аргументы, валидируй данные, следи, чтобы ссылки не были null. То есть, будь не мудаком, а вменяемым разработчиком. Потому что если unchecked исключение вылезло — это уже поздно пить боржоми, печенька уже утонула.