Что такое проверяемые исключения (checked exceptions) в Java и зачем они нужны?

Ответ

Проверяемые исключения (checked exceptions) — это исключения, которые компилятор Java требует явно обработать или объявить в сигнатуре метода. Они представляют ошибки, которые программа может и должна предвидеть и корректно обработать (например, проблемы с вводом-выводом, отсутствие файла).

Зачем они нужны:

  1. Обеспечение надежности: Компилятор заставляет разработчика задуматься об обработке потенциальных проблем, что повышает устойчивость кода.
  2. Улучшение документации: Сигнатура метода с throws явно указывает на возможные ошибки, улучшая читаемость API.
  3. Контроль за ошибками: Предотвращает ситуации, когда исключение может быть проигнорировано по невнимательности.

Пример:

// Компилятор требует либо обработать IOException, либо объявить его в throws
public String readFirstLine(String filePath) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
        return br.readLine();
    }
    // Или обработать на месте:
    // } catch (IOException e) { ... }
}

Альтернатива: Непроверяемые исключения (RuntimeException) используются для ошибок, которые часто указывают на баги в логике программы (например, NullPointerException, IllegalArgumentException).

Ответ 18+ 🔞

Ну вот, опять про эти ваши исключения, блядь. Сидишь такой, пишешь код, всё пучком, а тут бац — компилятор тебе как по ебалу: «А ты, сука, про IOException не забыл? А?». Это и есть проверяемые исключения, ёпта.

Что это за зверь такой? Это такие ошибки, которые компилятор, как заботливая, но ебнутая тёща, требует у тебя на виду держать. Типа, «сынок, файлик-то может не найтись, ты уж будь добр, приготовься». Не обработаешь или в сигнатуру не вынесешь — нихуя не скомпилируется.

Нахуя они вообще?

  1. Чтобы не быть распиздяем. Тебя буквально за шкирку трясут: «Смотри, тут может пиздануться, подстели соломки!». В теории код становится менее кривым.
  2. Чтобы не гадать, как в бабкиной книге сонника. Глянул на метод — throws IOException, SQLException — и сразу ясно, в какую жопу могут прилететь кирпичи. Документация, блядь, на уровне языка.
  3. Контроль, блядь. Чтобы какой-нибудь поц не сделал вид, что ошибок не бывает, и не проигнорировал их втихую.

Смотри, как это выглядит:

// Попробуй-ка этот метод без try-catch или throws написать — получишь пизды от компилятора
public String readFirstLine(String filePath) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
        return br.readLine();
    }
    // Либо тут лови, либо выше объявляй — третьего не ебут.
}

А что взамен? А взамен — непроверяемые исключения (RuntimeException). Это уже для случаев, когда ты сам мудак и накосячил в логике. NullPointerException, IllegalArgumentException — это ж не система тебя подвела, это ты, гений, просрал проверку на null или аргумент кривой передал. За такие ошибки компилятор тебя пинать не будет — сам разбирайся, когда на проде всё ебнется.