言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Java辞典

  1. トップページ
  2. Java辞典
  3. try-with-resources / AutoCloseable

try-with-resources / AutoCloseable

対応: Java 7(2011)

ファイルやネットワーク接続などのリソースを自動的にクローズする構文です。『try』の括弧内でリソースを宣言すると、ブロックを抜ける際に自動的に『close()』が呼び出されます(Java 7以降)。

構文

// リソースを自動クローズします(Java 7以降)
try (ResourceType res = new ResourceType()) {
    // resを使った処理
} catch (Exception e) {
    // 例外処理
}

// 複数のリソースをセミコロン区切りで宣言できます
try (
    ResourceType1 res1 = new ResourceType1();
    ResourceType2 res2 = new ResourceType2()
) {
    // 処理
}

// AutoCloseableを実装した独自クラスを定義します
class MyResource implements AutoCloseable {
    @Override
    public void close() {
        System.out.println("リソースをクローズしました。");
    }
}

主なインターフェース・クラス一覧

インターフェース / クラス概要
AutoCloseableclose() メソッドを持つインターフェースです。try-with-resources で使用するリソースはこれを実装します。
Closeablejava.io パッケージのインターフェースです。AutoCloseable を継承しており、IOException をスローします。
BufferedReaderCloseable を実装したファイル読み取りクラスです。
FileInputStreamCloseable を実装したバイトストリームクラスです。
Connection(java.sql)DB接続クラスです。AutoCloseable を実装しています。

サンプルコード

sample_TryWithResources.java
import java.io.*;

class Connection implements AutoCloseable {
    public Connection() { System.out.println("接続しました。"); }

    @Override
    public void close() { System.out.println("接続を切断しました。"); }
}

class TryWithResources {
    public static void main(String[] args) {
        // try-with-resources でファイルを安全に読み込みます
        try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("ファイルの読み込みに失敗しました: " + e.getMessage());
        }

        // 複数リソースを同時に扱います
        try (
            FileInputStream fis = new FileInputStream("input.txt");
            FileOutputStream fos = new FileOutputStream("output.txt")
        ) {
            int b;
            while ((b = fis.read()) != -1) {
                fos.write(b);
            }
        } catch (IOException e) {
            System.out.println("エラー: " + e.getMessage());
        }

        // 独自クラスで AutoCloseable を実装します
        try (Connection conn = new Connection()) {
            System.out.println("データを処理中…");
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 出力: 『接続しました。』→ 『データを処理中…』→ 『接続を切断しました。』
    }
}
TryWithResources.java
javac TryWithResources.java
java TryWithResources
ファイルの読み込みに失敗しました: data.txt (No such file or directory)
エラー: input.txt (No such file or directory)
接続しました。
データを処理中…
接続を切断しました。

概要

try-with-resources 以前は finally ブロックで明示的に close() を呼び出す必要がありましたが、この構文を使うことでクローズ処理の書き忘れを防ぎ、コードを簡潔にできます。複数のリソースを宣言した場合、宣言した順とは逆順でクローズされます。

try-with-resources を使うには、リソースクラスが AutoCloseable(または Closeable)を実装している必要があります。close() 内で例外が発生した場合、try ブロックの例外と合わせて「抑制された例外」として記録されます。e.getSuppressed() で取得できます。

例外処理の基本的な構文については『try / catch / finally / throw』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。