カテゴリ: Javaの例外処理 更新日: 2026/05/05

Javaのtry-with-resources文を完全ガイド!初心者でもわかるリソースの自動クローズ方法

354
Java の try-with-resources 文とは?リソースを自動で閉じる方法

先生と生徒の会話形式で理解しよう

生徒

「Javaでファイルを扱うときに、リソースを自動で閉じる方法ってあるんですか?」

先生

「ありますよ。try-with-resources文を使うことで、ファイルやストリームなどのリソースを自動的に閉じることができます。」

生徒

「それって普通のtry-catchとはどう違うんですか?」

先生

「では、try-with-resourcesの基本的な使い方と仕組みを一緒に見ていきましょう!」

1. try-with-resources文とは?

1. try-with-resources文とは?
1. try-with-resources文とは?

Javaのtry-with-resources文は、Java 7から導入された機能で、リソースの自動解放を目的としています。たとえば、BufferedReaderFileInputStreamなどを使った後に、close()メソッドを呼び忘れるとリソースリークの原因になります。

しかしtry-with-resourcesを使えば、例外が発生しても確実にリソースが閉じられるため、安全でシンプルなコードが書けるのです。

2. 基本的な構文と使い方

2. 基本的な構文と使い方
2. 基本的な構文と使い方

Javaでtry-with-resources文を使うときは、以下のような構文になります。リソースの宣言はtry()の括弧の中で行い、あとは通常のtry-catchと同じように書けます。


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryWithResourcesExample {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("sample.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("ファイル読み込み中にエラーが発生しました: " + e.getMessage());
        }
    }
}

ポイント:リソースはAutoCloseableインタフェースを実装している必要があります。BufferedReaderScannerFileInputStreamなどはすでに実装済みなので、そのまま使えます。

3. 従来のtry-finally文との違い

3. 従来のtry-finally文との違い
3. 従来のtry-finally文との違い

Java 7以前は、リソースを使った後にfinallyブロックでclose()を呼び出していました。


BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("sample.txt"));
    String line = reader.readLine();
    System.out.println(line);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

このようにnullチェックネストが増えて読みにくくなってしまいます。try-with-resources文ならこの煩雑さを解消できるのがメリットです。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第5版をAmazonで見る

※ Amazon広告リンク

4. 複数リソースの同時管理も可能

4. 複数リソースの同時管理も可能
4. 複数リソースの同時管理も可能

Javaのtry-with-resources文では、複数のリソースを同時に管理することもできます。カンマ区切りで並べるだけです。


try (
    BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
    PrintWriter writer = new PrintWriter("output.txt")
) {
    String line;
    while ((line = reader.readLine()) != null) {
        writer.println(line.toUpperCase());
    }
} catch (IOException e) {
    e.printStackTrace();
}

このように、ファイルの読み込みと書き込みを一括で安全に管理できるのは、実務でも非常に役立ちます。

5. 独自クラスでtry-with-resourcesを使うには?

5. 独自クラスでtry-with-resourcesを使うには?
5. 独自クラスでtry-with-resourcesを使うには?

自作のクラスでtry-with-resources文を使いたい場合は、AutoCloseableインタフェースを実装すればOKです。


public class MyResource implements AutoCloseable {
    public void doSomething() {
        System.out.println("リソースを使っています...");
    }

    @Override
    public void close() {
        System.out.println("リソースを閉じました。");
    }
}

public class Main {
    public static void main(String[] args) {
        try (MyResource resource = new MyResource()) {
            resource.doSomething();
        }
    }
}

リソースを使っています...
リソースを閉じました。

このようにAutoCloseableを実装するだけで、try-with-resources文で自作クラスも安全に使えるようになります。

6. Javaのバージョンによる記述の違い

6. Javaのバージョンによる記述の違い
6. Javaのバージョンによる記述の違い

Java 9からは、try-with-resourcesで事前に宣言した変数をそのまま使えるようになりました。以下のように、外部で定義されたリソースも使えます。


BufferedReader reader = new BufferedReader(new FileReader("sample.txt"));
try (reader) {
    System.out.println(reader.readLine());
}

これはJava 9以降の新機能なので、Java 8以前を使っている場合は従来の方法を使いましょう。

7. よくある注意点と失敗例

7. よくある注意点と失敗例
7. よくある注意点と失敗例

try-with-resourcesを使う上での注意点をいくつか紹介します。

  • リソースはAutoCloseableまたはCloseableを実装している必要がある
  • Java 9の構文は、古いJavaバージョンでは使えない
  • tryブロック内でnewしていないオブジェクトはJava 9未満では使えない

これらを押さえておけば、Javaのtry-with-resources文をより安全かつ効果的に活用できます。

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaのtry-with-resources文とは具体的にどのような機能ですか?初心者にもわかりやすく教えてください。

Javaのtry-with-resources文は、Java 7から導入された非常に便利な構文です。主にファイル操作やネットワーク通信などで使用する「リソース」を、プログラムの実行が終わった後に自動的に閉じてくれる(クローズしてくれる)仕組みです。従来のJavaプログラミングでは、使い終わったリソースを明示的に閉じる必要がありましたが、この構文を使えば、開発者が手動でクローズ処理を書かなくても、システムが確実にリソースを解放してくれます。これにより、メモリ不足やファイルが開けなくなるリソースリークという深刻なバグを防ぐことができます。
Javaの例外処理の一覧へ
新着記事
Python
NumPyのスライスの使い方!範囲指定で配列を取り出す方法
NumPyのスライスの使い方!範囲指定で配列を取り出す方法
AWS
【AWS】CloudWatchで障害検知を自動化する設計パターン
【AWS】CloudWatchで障害検知を自動化する設計パターンを初心者向けに解説!AWS監視とアラート通知の基本
AWS
【AWS】RDSの無料枠とは?対象インスタンスタイプと注意点を解説
【AWS】RDSの無料枠とは?対象インスタンスタイプと注意点を解説
Flutter
Flutterの入力フォーム作成!TextField・TextFormFieldの基本
Flutterの入力フォーム作成!TextField・TextFormFieldの基本を初心者向けに解説
人気記事
Flutter
Flutterの開発に必要なもの!パソコン・ツール・OSなど準備まとめ
Flutterの開発に必要なもの!パソコン・ツール・OSなど準備まとめ
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク