К какому типу исключений в Java относится IOException: checked или unchecked?

«К какому типу исключений в Java относится IOException: checked или unchecked?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

IOException и большинство его подклассов (например, FileNotFoundException, EOFException) являются checked исключениями (проверяемыми исключениями).

Что это значит?

  • Компилятор Java требует обязательной обработки таких исключений.
  • Метод, который может сгенерировать IOException, должен либо:
    1. Обработать его с помощью блока try-catch.
    2. Объявить его в своей сигнатуре с помощью ключевого слова throws.

Пример 1: Обработка через try-catch

import java.io.*;

public void readFirstLine(String filePath) {
    try {
        BufferedReader reader = new BufferedReader(new FileReader(filePath));
        String line = reader.readLine();
        System.out.println(line);
        reader.close();
    } catch (FileNotFoundException e) {
        System.err.println("Файл не найден: " + e.getMessage());
    } catch (IOException e) {
        System.err.println("Ошибка ввода-вывода: " + e.getMessage());
    }
}

Пример 2: Объявление в сигнатуре метода (проброс исключения)

public String readFirstLine(String filePath) throws IOException {
    // Компилятор знает, что вызывающий код должен будет обработать это исключение.
    BufferedReader reader = new BufferedReader(new FileReader(filePath));
    String line = reader.readLine();
    reader.close();
    return line;
}

Почему IOException — checked? Это исключение сигнализирует о потенциальной проблеме во внешней среде (отсутствие файла, разрыв сети, ошибка диска), которая часто является восстанавливаемой. Требуя явной обработки, язык поощряет разработчиков писать устойчивый код, способный грамотно реагировать на сбои ввода-вывода.

Контраст с unchecked исключениями: Исключения времени выполнения, такие как NullPointerException или ArithmeticException, являются unchecked. Они обычно указывают на ошибки программирования (баги), и компилятор не требует их обязательного объявления или обработки.