カテゴリ: Javaの例外処理 更新日: 2025/11/12

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入門 第4版を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の例外処理の一覧へ
新着記事
FlutterのMVP・MVVMアーキテクチャの違いと使い分け
FlutterのMVP・MVVMアーキテクチャの違いと使い分けを初心者向けに解説!
オニオンアーキテクチャの基本とFlutterでの適用例
オニオンアーキテクチャの基本とFlutterでの適用例を初心者向けに解説
クリーンアーキテクチャとは?Flutterでの導入メリット
クリーンアーキテクチャとは?Flutterでの導入メリットをやさしく解説
【AWS】RDS for Oracleの特徴・できないこと・バージョン・料金まとめ
【AWS】RDS for Oracleの特徴・できないこと・バージョン・料金を初心者向けに徹底解説
人気記事
インスタンスタイプの料金比較と最適な選び方(最新2025年版)
AWSのインスタンスタイプの料金比較と最適な選び方【2025年最新版】
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説

🔌 USBポート不足を解消

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

UGREEN USB-Cハブを見る

※ Amazon広告リンク