Ответ
IOException и большинство его подклассов (например, FileNotFoundException, EOFException) являются checked исключениями (проверяемыми исключениями).
Что это значит?
- Компилятор Java требует обязательной обработки таких исключений.
- Метод, который может сгенерировать
IOException, должен либо:- Обработать его с помощью блока
try-catch. - Объявить его в своей сигнатуре с помощью ключевого слова
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. Они обычно указывают на ошибки программирования (баги), и компилятор не требует их обязательного объявления или обработки.