Ответ
Проверяемые исключения (checked exceptions) — это исключения, которые компилятор Java обязывает обрабатывать или объявлять. Они наследуются от java.lang.Exception (но не от RuntimeException).
Непроверяемые исключения (unchecked exceptions) — это исключения, обработка которых не требуется компилятором. К ним относятся:
RuntimeExceptionи его наследники (логические ошибки программы).Errorи его наследники (критические системные сбои).
| Ключевые различия: | Критерий | Проверяемые (Checked) | Непроверяемые (Unchecked) |
|---|---|---|---|
| Наследование | От Exception (не RuntimeException) |
От RuntimeException или Error |
|
| Обработка | Обязательна (try-catch или throws) |
Не обязательна | |
| Время проверки | Время компиляции | Время выполнения | |
| Примеры | IOException, SQLException, ClassNotFoundException |
NullPointerException, IllegalArgumentException, ArrayIndexOutOfBoundsException, OutOfMemoryError |
Почему такое разделение? Проверяемые исключения предназначены для восстановимых условий, которые программа должна предвидеть (например, отсутствие файла). Непроверяемые — для ошибок программирования или фатальных сбоев.
Пример на практике:
// Проверяемое исключение: ОБЯЗАТЕЛЬНА обработка или объявление 'throws'
try {
FileInputStream fis = new FileInputStream("missing.txt");
} catch (FileNotFoundException e) { // Компилятор требует этот блок
System.err.println("Файл не найден: " + e.getMessage());
}
// Непроверяемое исключение: обработка НЕ обязательна
String text = null;
// Компилятор не ругается, но в runtime упадет NullPointerException
// System.out.println(text.length()); Ответ 18+ 🔞
Давай разберём эту хуйню про исключения, а то у меня уже глаза на лоб лезут от этих официальных формулировок. Сижу тут, как Герасим немой, и думаю: «Му-му, блядь, что за проверяемая-непроверяемая хрень?».
Смотри, вся соль в том, что компилятор Java — он как та самая вредная барыня из рассказа. Он заставляет тебя с некоторыми исключениями церемониться. Это и есть проверяемые (checked). Наследуются они от Exception, но не от его шального сынка RuntimeException. Если ты их не обработаешь в try-catch или не выставишь в объявлении метода через throws — он тебе просто код не скомпилирует, сволочь! Типа: «Иди нахуй, мужик, разберись с этим FileNotFoundException, а потом приходи».
А есть другие — непроверяемые (unchecked). Это отпрыски RuntimeException (логические косяки) или Error (системный пиздец вроде OutOfMemoryError). Компилятор на них смотрит сквозь пальцы, как на шалости. «Ладно, — говорит, — разбирайтесь сами в рантайме, мне похуй». И вот тут-то они и вылезают, когда уже программа работает, и начинается: NullPointerException, ArrayIndexOutOfBoundsException — классика жанра, ёпта!
Зачем это разделение, спросишь? А затем, что проверяемые — это обычно для ситуаций, из которых можно как-то выкрутиться. Файл не найлся? Скажи пользователю. Сетевое соединение отвалилось? Попробуй переподключиться. Программа должна это предвидеть. А непроверяемые — это уже наши с тобой косяки, братан. Ты ссылку забыл проверить на null или за границы массива полез. Или система вообще ебнулась. Тут уж не до восстановления, часто.
Вот, смотри на практике, как это выглядит:
// Проверяемое исключение — компилятор ОБЯЗЫВАЕТ тебя с ним что-то сделать.
// Не сделаешь — получишь по ебалу ошибкой компиляции.
try {
FileInputStream fis = new FileInputStream("файла_нет_сука.txt");
} catch (FileNotFoundException e) { // Без этого блока — нихуя не скомпилируется!
System.err.println("Ну я же говорил, файла нет: " + e.getMessage());
}
// Непроверяемое исключение — компилятору похуй. Он пропустит.
// А вот во время выполнения получишь сюрприз.
String text = null;
// Компилятор молчит, как партизан. Но запустишь — БАЦ! — NullPointerException в ебло.
// System.out.println(text.length());
Вот и вся философия. Одни исключения — как назойливая совесть, которая пилит тебя на этапе сборки: «Сделай что-нибудь!». Другие — как неожиданный пиздюль в темном переулке рантайма. Выбирай, с чем тебе проще жить.