Ответ
Checked исключение (проверяемое исключение) — это исключение, которое компилятор Java обязывает либо обработать в блоке try-catch, либо объявить в сигнатуре метода с помощью ключевого слова throws. Все checked исключения являются подклассами java.lang.Exception, но не java.lang.RuntimeException.
Почему они существуют? Они предназначены для обработки ожидаемых, но нештатных ситуаций, от которых программа может потенциально восстановиться (например, отсутствие файла, разрыв сетевого соединения).
Пример 1: Объявление в throws
public String readFirstLineFromFile(String path) throws IOException {
// FileReader может выбросить FileNotFoundException (checked)
BufferedReader br = new BufferedReader(new FileReader(path));
return br.readLine(); // readLine() может выбросить IOException
}
Пример 2: Обработка в try-catch
public String readFirstLineFromFile(String path) {
try {
BufferedReader br = new BufferedReader(new FileReader(path));
return br.readLine();
} catch (IOException e) { // Ловим checked исключение
// Восстановление: возвращаем значение по умолчанию
System.err.println("Could not read file: " + e.getMessage());
return "";
}
}
| Сравнение с unchecked исключениями (RuntimeException): | Критерий | Checked Exception | Unchecked Exception (RuntimeException) |
|---|---|---|---|
| Обработка | Обязательна (компилятор проверяет) | Не обязательна | |
| Наследование | Exception, но не RuntimeException |
RuntimeException |
|
| Тип ошибок | Восстановимые, внешние условия (I/O, сеть) | Ошибки программирования (NPE, индекс за границами) | |
| Примеры | IOException, SQLException, ClassNotFoundException |
NullPointerException, IllegalArgumentException, ArrayIndexOutOfBoundsException |
Ответ 18+ 🔞
А, ну вот, смотри, сейчас объясню про эти ваши checked исключения, чтобы ты, блядь, не путался, как последний распиздяй.
Представь себе, ты пишешь программу, и компилятор Java — это такой занудный, блядь, надзиратель, который стоит у тебя за спиной и орёт: «Э, ты куда пошёл, сука? А файлик-то существует? А сеть-то жива?» Вот это и есть checked исключения. Компилятор тебя обязывает, блядь, либо их поймать в try-catch, либо честно объявить в методе, мол, «ребята, я тут могу накосячить, вы там сами решайте».
Все они — детища java.lang.Exception, но не этих ваших RuntimeException, которые, как внезапный понос, — приходят нежданно-негаданно.
Зачем это всё, спросишь? А затем, ёпта, чтобы обрабатывать ситуации, от которых можно, теоретически, отползти и продолжить жить. Файл не нашёлся? Ну, бля, не нашёлся и не нашёлся, скажем пользователю «извините, мудак», и пошли дальше. Сеть отвалилась? Попробуем через пять минут, а не падаем сразу в пизду.
Пример первый: Спиздуй, не моя проблема (объявляем throws).
Вот смотри, метод читает файл. А файл — он такая хитрая жопа, может и не существовать вовсе.
public String readFirstLineFromFile(String path) throws IOException {
// FileReader — тот ещё пиздопроёб, сразу орёт, если файла нет (FileNotFoundException)
BufferedReader br = new BufferedReader(new FileReader(path));
return br.readLine(); // И тут readLine() может взбрыкнуть с IOException
}
Ты как бы говоришь: «Я, блядь, предупредил! Кто будет этот метод вызывать — тот пусть и разбирается с последствиями. Моя хата с краю».
Пример второй: Сам всё улажу, мама не горюй (ловим в try-catch).
А вот тут мы не скидываем ответственность, а берём её на себя, как взрослые дяди.
public String readFirstLineFromFile(String path) {
try {
BufferedReader br = new BufferedReader(new FileReader(path));
return br.readLine();
} catch (IOException e) { // Ловим эту checked заразу
// Восстанавливаемся: ну не прочиталось и хуй с ним, вернём пустую строку
System.err.println("Бля, файл прочитать не вышло: " + e.getMessage());
return "";
}
}
Поймали, утерлись, жизнь продолжается. Волнение — ебать, но терпение есть.
А теперь, чтобы совсем не ебнуть мозг, вот тебе сравнение в стиле «на пальцах»:
| Критерий | Checked Exception (Зануда) | Unchecked Exception (Внезапный понос) |
|---|---|---|
| Обязаловка | Компилятор тебя за шкирку: «Обработай, мудак!» | Похуй. Хочешь — лови, не хочешь — пусть система падает. |
| Родословная | Exception, но не RuntimeException. |
Чистокровный RuntimeException. |
| Из-за чего бывают | Внешние, ебальные обстоятельства (нет файла, сеть сдохла, база отвалилась). | Твои личные косяки, как программиста (обращение к null, индекс за границей массива). |
| Примеры из жизни | IOException, SQLException |
NullPointerException (классика, блядь), ArrayIndexOutOfBoundsException |
Короче, checked — это когда ты должен быть готов к пиздецу, который может случиться не по твоей вине. А unchecked — это когда пиздец случается строго по твоей вине, и компилятор лишь злорадно хихикает в сторонке. Всё, вопрос закрыт, иди работай.