С какими непроверяемыми (unchecked) исключениями вы сталкивались в Java?

Ответ

Unchecked исключения (наследники RuntimeException) не требуют обязательной обработки в коде. С ними часто сталкиваются в работе:

  1. NullPointerException — самая частая проблема при работе с неинициализированными ссылками.

    String str = null;
    int length = str.length(); // NullPointerException
  2. IllegalArgumentException — передача недопустимого аргумента в метод.

    public void setAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("Возраст не может быть отрицательным");
        }
        this.age = age;
    }
  3. IndexOutOfBoundsException / ArrayIndexOutOfBoundsException — обращение к несуществующему индексу массива или коллекции.

  4. ClassCastException — неудачное приведение типов во время выполнения.

    Object obj = "Some string";
    Integer num = (Integer) obj; // ClassCastException
  5. NumberFormatException — ошибка преобразования строки в число.

    int num = Integer.parseInt("123abc"); // NumberFormatException
  6. ConcurrentModificationException — изменение коллекции во время итерации по ней (кроме использования итератора).

Почему они unchecked? Эти исключения обычно указывают на ошибки программиста (баги), которые можно и нужно исправлять в коде, а не обрабатывать. Их проверка на этапе компиляции часто нецелесообразна.

Ответ 18+ 🔞

Ну ты смотри, какие у нас тут гости пожаловали — unchecked исключения! Это те самые, с которыми ты, сука, каждый день встречаешься, а компилятор на них смотрит сквозь пальцы, как на какую-то мелочь. Типа, "разбирайся сам, мудила, я тебе не нянька". И правильно, блядь!

Вот смотри, король всех этих пиздецов — NullPointerException. Это когда ты лезешь к переменной, а она, сука, null. Как будто пытаешься позвать друга, а там пустота, блядь. И ты такой: "Э, где длина строки?" — а её нет, пиздец.

String str = null;
int length = str.length(); // Тут тебе и вылезет, хитрая жопа

Дальше идёт IllegalArgumentException. Это когда ты методу какую-то хуйню подсовываешь, а он тебе: "Нет, мудак, так не пойдёт". Например, возраст отрицательный пытаешься установить. Да ты что, блядь, человек из подполья?

public void setAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("Возраст не может быть отрицательным, ёпта!");
    }
    this.age = age;
}

А вот IndexOutOfBoundsException — это классика, блядь. Пытаешься достать элемент из массива или списка, а там такого индекса нихуя нет. Как будто в шкафу десять полок, а ты лезешь на одиннадцатую, и на тебя всё валится, пиздец.

Потом у нас ClassCastException. Это когда ты такой умный, пытаешься превратить строку в число насильно. "Ну я же вижу, там цифры!" — а нихуя, там буквы. И программа тебе: "Нет, мудила, это не Integer, это String, в рот меня чих-пых!"

Object obj = "Some string";
Integer num = (Integer) obj; // Тут тебя и накроет, как медным тазом

NumberFormatException — близкий родственник. Пытаешься строку "123abc" в число преобразовать. Ну да, конечно, там же цифры в начале, а остальное — так, мелочь. А программа: "Мудаааак!". И всё.

И на десерт — `ConcurrentModificationException`. Это когда ты коллекцию во время обхода меняешь, да ещё и не через итератор. Представь: ты идёшь по коридору и выкидываешь двери из петель, а потом удивляешься, что в соседнюю комнату зайти не можешь. Вот это оно, блядь.

И запомни, ёпта: эти исключения unchecked не потому, что они неважные, а потому что это обычно твои собственные косяки, которые надо в коде чинить, а не оборачивать в try-catch. Компилятор тебе доверия ебать ноль, вот и не проверяет. Сам виноват, мудила!