Ответ
В Java исключения делятся на три основные категории, отличающиеся необходимостью обработки и происхождением:
-
Проверяемые исключения (Checked Exceptions)
- Наследуются от:
java.lang.Exception(но не отRuntimeException). - Особенность: Компилятор требует их явной обработки (блок
try-catch) или объявления в сигнатуре метода с помощьюthrows. Это ошибки, от которых программа может и должна восстановиться. - Примеры:
IOException,SQLException,ClassNotFoundException. -
Пример кода:
// Обязательная обработка try { FileInputStream fis = new FileInputStream("file.txt"); } catch (FileNotFoundException e) { // FileNotFoundException - checked System.err.println("Файл не найден: " + e.getMessage()); } // Или объявление в throws public void readFile() throws IOException { ... }
- Наследуются от:
-
Непроверяемые исключения (Unchecked Exceptions / Runtime Exceptions)
- Наследуются от:
java.lang.RuntimeException. - Особенность: Компилятор не проверяет их обработку. Обычно указывают на ошибки программирования (логические ошибки, неправильное использование API).
- Примеры:
NullPointerException,ArrayIndexOutOfBoundsException,IllegalArgumentException. - Пример кода:
String str = null; str.length(); // Выбросит NullPointerException (unchecked)
- Наследуются от:
-
Ошибки (Errors)
- Наследуются от:
java.lang.Error. - Особенность: Критические проблемы уровня JVM или системы, которые приложение обычно не может или не должно обрабатывать.
- Примеры:
OutOfMemoryError,StackOverflowError,LinkageError.
- Наследуются от:
Почему такое разделение?
- Checked Exceptions обеспечивают контроль над recoverable-ошибками на этапе компиляции, заставляя разработчика продумать сценарии восстановления.
- Unchecked Exceptions не обременяют код обязательной обработкой для ошибок программирования, которые часто невозможно осмысленно обработать в месте возникновения.
Ответ 18+ 🔞
А, ну вот, классика, блядь! Подходи, садись, сейчас я тебе про исключения в Java так расскажу, что ты, сука, сам начнёшь их в жизни ловить, как мух.
Смотри, вся эта ёбанная система исключений — она как трёхслойный торт, только вместо крема там сплошные косяки и разочарования. И слои эти — не просто так, у каждого своя, блядь, философия.
Первый слой, самый занудный — Проверяемые исключения (Checked Exceptions).
Вот эти, сука, как назойливая тёща. Наследуются от Exception, но не от RuntimeException, запомни эту хуйню.
- Особенность их, блядь, в чём? Компилятор, этот занудный пидор, требует с них взятку. Или ты их в
try-catchоборачиваешь, или в сигнатуре метода черезthrowsобъявляешь, что, мол, я, блядь, тут не при чём, пусть кто-то выше разбирается. Считается, что от таких ошибок программа может оправиться. Типа файл не найден — ну скажи пользователю, идиот, и всё. - Примеры:
IOException,SQLException. Всё, что связано с внешним миром, который всегда, сука, подводит. - Вот, смотри, как это выглядит в коде, эти мытарства:
// Обязательная обработка, а то не скомпилируется, сволочь!
try {
FileInputStream fis = new FileInputStream("file.txt"); // готовься к пиздецу
} catch (FileNotFoundException e) { // FileNotFoundException — checked, его ловить ОБЯЗАН
System.err.println("Файл не найден, гений: " + e.getMessage()); // классика
}
// Или второй путь — сбросить ответственность наверх, как трушный менеджер
public void readFile() throws IOException { ... } // читайте сами, я в доле
Второй слой, самый частый и позорный — Непроверяемые исключения (Unchecked / Runtime Exceptions).
А вот это уже наши, родные, косяки программиста! Наследуются от RuntimeException.
- Особенность: Компилятор на них забивает хуй. Он как бы говорит: "Ну, идиот, если хочешь на
nullпозвать.length()— твои проблемы, делай". Это ошибки логики, кривых рук и пофигизма. - Примеры:
NullPointerException(король, блядь!),ArrayIndexOutOfBoundsException(выйти за границы массива — это святое). - Код, который все пишут и все ненавидят:
String str = null; // гениальный ход
str.length(); // И тут тебе, внезапно, пизда! NullPointerException (unchecked) — компилятор молчал, как партизан.
Третий слой, апокалиптический — Ошибки (Errors).
Это уже не наши проблемы, это пиздец уровня JVM. Наследуются от java.lang.Error.
- Особенность: Это как удар метеорита по серверу. Приложение обычно не должно и не может это ловить. Ну что ты будешь делать с
OutOfMemoryError? Рыдать? - Примеры:
OutOfMemoryError(память кончилась, ёбта),StackOverflowError(зарекурсился до посинения).
А зачем, спрашивается, это ебаное разделение? А вот зачем, умник:
- Checked Exceptions — это чтобы контролировать recoverable-ошибки ещё на этапе компиляции. Заставляют тебя, распиздяя, хотя бы подумать: "А что, если файла нет? А если сеть упала?". Без обработки — не скомпилируешься, хитрая жопа!
- Unchecked Exceptions — это чтобы не засирать код обязательными
try-catchдля ошибок программиста. Ну какой смысл везде ловитьNullPointerException? Это же надо код чинить, а не оборачивать в салфетку!
Вот и вся магия, блядь. Один слой — для внешнего мира, который нас ебёт. Второй — для нас самих, потому что мы сами себя ебём. Третий — для вселенной, которая ебёт всех сразу.