3秒でわかる
ファイルや通信など外部との入出力が失敗したときに Java が投げる検査例外。catch か throws をコンパイラが必ず要求します。
もう少し詳しく
どういうものか
java.io.IOException は、ファイルの読み書き、ネットワーク通信、標準入出力といった外部とのやり取りが失敗したときに投げられる例外です。検査例外 (checked exception) に分類されるため、投げる可能性のある処理を書いた時点で、catch するか throws を宣言するかをコンパイラが要求します。書かなければコンパイルが通りません。
なぜ必要か
計算はコードが正しければ必ず成功しますが、入出力はそうではありません。ファイルが消えている、権限が無い、ディスクが一杯、通信が切れた、といった事情はプログラムの外側で起きます。Java はこの「必ず起こりうる失敗」を型で表現し、書き手に対処を強制する方針を取りました。IOException を書かされるのが面倒に感じる場面もありますが、それは失敗経路を無視できない仕組みが働いている証拠です。
具体例
import java.io.*;
import java.nio.file.*;
public class ReadFile {
public static void main(String[] args) {
Path path = Path.of("data.txt");
try (BufferedReader br = Files.newBufferedReader(path)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (NoSuchFileException e) {
System.err.println("ファイルが見つかりません " + e.getFile());
} catch (IOException e) {
System.err.println("読み込みに失敗しました " + e.getMessage());
}
}
}つまずきやすいところ
似た用語との違い
| 例外 | 検査されるか | 主な原因 |
|---|---|---|
| IOException | される | 外部要因の入出力失敗 |
| UncheckedIOException | されない | IOException を包み直して伝播させたいとき |
| NullPointerException | されない | コードの書き間違い |