← SEARCHABLE ARCHIVE
Java · 2026-08-06

Java 基礎からマスターまで — 第7回

例外とtry-with-resourcesで失敗を処理する

INTERACTIVE READING MODE →

本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。

ファイル、ネットワーク、入力値はいつでも失敗する可能性があります。 Javaの例外とリソース管理文法は、失敗を伝え、どのパスでもリソースを閉じるために使用されます。

例外を渡す

public Settings loadSettings(Path path) throws IOException {
    String json = Files.readString(path);
    return parser.parse(json);
}

呼び出し側が回復方法を決定する必要がある場合は、例外を無理やり内部で隠さないでください。 コンテキストを追加するときは、元の例外を原因として保存しなければならない。

try {
    settings = loadSettings(path);
} catch (IOException error) {
    logger.warn("settings load failed", error);
    settings = Settings.defaults();
}

処理できる例外だけをキャッチする。 すべてのExceptionをつかんで何もしないと、実際のバグまで正常のように進むことができる。

try-with-resources

public List<String> readLines(Path path) throws IOException {
    try (BufferedReader reader = Files.newBufferedReader(path)) {
        return reader.lines().toList();
    }
}

AutoCloseableを実装したオブジェクトを括弧内に作成すると、ブロックの終わりにcloseが呼び出されます。 通常の戻りパスと例外パスの両方でファイルハンドルがクリーンアップされます。

検査例外とランタイム例外

検査例外は、メソッド宣言またはキャッチで処理するかどうかを示します。 IllegalArgumentExceptionなどのランタイム例外は、誤った呼び出し契約やプログラミングエラーによく使用されます。

どちらが無条件に良いのではなく、呼び出し元が回復できる失敗であるかが基準です。

状態が完了したら交換する

Settings loaded = loadSettings(path);
currentSettings = loaded;

新しい値を完全に作成してフィールドに入れると、ロード中に失敗しても既存の設定は保持されます。 例外設計は、多くのキャッチを作成するのではなく、失敗したときにリソースとオブジェクトの状態がどのように残るかを決定することです。