Ответ
В Java непроверяемые (unchecked) исключения не требуют обязательного объявления в throws или обработки в блоке try-catch. Они являются подклассами RuntimeException или Error.
Основные примеры RuntimeException:
NullPointerException– обращение к методу или полюnullобъекта.ArrayIndexOutOfBoundsException– выход за границы массива.IllegalArgumentException– передача недопустимого аргумента в метод.IllegalStateException– вызов метода в недопустимом состоянии объекта.ClassCastException– некорректное приведение типов.ArithmeticException– арифметическая ошибка (например, деление на ноль).UnsupportedOperationException– вызов неподдерживаемой операции.
Примеры Error (критические ошибки JVM):
OutOfMemoryError– недостаточно памяти в куче (Heap).StackOverflowError– переполнение стека вызовов.NoClassDefFoundError– JVM не может найти определение класса.
Пример кода, генерирующего unchecked-исключения:
// NullPointerException
String str = null;
int length = str.length();
// ArrayIndexOutOfBoundsException
int[] numbers = {1, 2, 3};
int value = numbers[5];
// ArithmeticException
int result = 10 / 0;
// ClassCastException
Object obj = "Hello";
Integer num = (Integer) obj;
Хотя эти исключения не требуют обязательной обработки, хорошей практикой является их предвосхищение и корректная обработка для повышения надежности приложения.
Ответ 18+ 🔞
Смотри, вот эта вся хуйня с unchecked исключениями в Java — это как ходить по минному полю в тапочках. Вроде компилятор тебя не держит за жопу, не заставляет оборачивать в try-catch или пихать в throws, но это не значит, что всё безопасно. Это потом аукнется, блядь.
Короче, это всё наследники RuntimeException или Error. Первые — это когда ты сам накосячил по логике, вторые — когда уже JVM, сука, сдалась и руки опустила.
Вот тебе самые популярные RuntimeException, которые будут тебя преследовать:
NullPointerException— классика, жанра. Пытаешься позвать метод уnull, а он тебе: «А я, блядь, кто? Я — ничто!».ArrayIndexOutOfBoundsException— полез за пятым элементом в массив из трёх. Ну ты гений, ёпта. Индекс — не предложение, его нарушать нельзя.IllegalArgumentException— сунул методу какую-то дичь вместо аргумента. Метод обиделся и швырнул тебе это исключение обратно в ебальник.IllegalStateException— пытаешься вызвать метод не тогда, когда надо. Типа «стартовать» уже работающий движок. Нельзя, блядь, он уже работает!ClassCastException— решил, что строка — это на самом делеInteger. Ну да, конечно, а я — Наполеон. Приведение типов — не магия, ебанашка.ArithmeticException— поделил на ноль. Математику в школе прогуливал? Бесконечность не наступила, наступил пиздец.UnsupportedOperationException— вызвал метод, который специально сделан заглушкой. «Не поддерживается» — значит, не трогай, идиот.
А это уже Error — тут уже не до шуток, это JVM кричит «ВСЁ ПРОПАЛО!»:
OutOfMemoryError— память в куче кончилась. Все объекты, которые ты создал и не отпустил, тебя же и придушили. Пиздец, Карл.StackOverflowError— рекурсия ушла в бесконечность и сломала стек. Цикличная зависимость или просто тупой код. Всё, стек переполнен, караул.NoClassDefFoundError— JVM ищет класс, а его нет. Удалил, переместил, сломалась сборка. Класс пропал, и жизнь потеряла смысл.
Вот, смотри, как легко их сгенерировать, даже не стараясь:
// NullPointerException
String str = null;
int length = str.length(); // Ёб твою мать, str же null!
// ArrayIndexOutOfBoundsException
int[] numbers = {1, 2, 3};
int value = numbers[5]; // В массиве всего три, а ты лезешь за пятым! Гений!
// ArithmeticException
int result = 10 / 0; // Делишь на ноль. Нобелевку по математике жди.
// ClassCastException
Object obj = "Hello";
Integer num = (Integer) obj; // Строка — это не Integer, мудак. Что ты делаешь?
Вот и вся магия. Компилятор промолчит, но в рантайме тебе вынесут мозг. Поэтому хоть и не обязательно, но предвидеть эту хуйню и обрабатывать — это признак того, что у тебя в голове не опилки. Надёжность приложения, блядь, от этого и зависит. Не делай вид, что их нет, а то они сделают вид, что нет твоего работающего приложения.