Java 速習チュートリアル

Java のtry-with-resources

1. リソースをクローズする重要性

ファイル、ストリーム、あるいはその他のリソースを扱う際、使用後にそれらをクローズ(終了処理)することは非常に重要です。もしリソースのクローズを忘れてしまうと、メモリを消費し続けたり、プログラムが終了するまでそのファイルを再度開けなくなったりする可能性があります。

       注意: まだ「ファイル」や「ストリーム」の詳細については学習していません。これらのトピックについては次の章で詳しく解説します。今は、try-with-resourcesがどのように動作するかに集中してください。

以前の古いコードでは、リソースの close() メソッドを手動で呼び出す必要がありました:

例:

import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
  public static void main(String[] args) {
    try {
      FileOutputStream output = new FileOutputStream("filename.txt");
      output.write("Hello".getBytes());
      output.close();  // 手動でクローズしなければならない
      System.out.println("ファイルへの書き込みに成功しました。");
    } catch (IOException e) {
      System.out.println("ファイルの書き込み中にエラーが発生しました。");
    }
  }
}

2. Javaのtry-with-resources

Java 7以降では、try-with-resourcesを使用できるようになりました。これはファイルやストリームなどのリソースを扱うための特別な形式の try 文です。

リソースは try(...) の括弧内で宣言されます。Javaは、ブロックが終了した際に——たとえエラー(例外)が発生したとしても——そのリソースを自動的にクローズします。

例(try-with-resources):

import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
  public static void main(String[] args) {
    // リソースは try() の中でオープンされる
    try (FileOutputStream output = new FileOutputStream("filename.txt")) {
      output.write("Hello".getBytes());
      // ここで close() を呼び出す必要はない
      System.out.println("ファイルへの書き込みに成功しました。");
    } catch (IOException e) {
      System.out.println("ファイルの書き込み中にエラーが発生しました。");
    }
  }
}

3. なぜtry-with-resourcesを使うのか?

  • より安全(Safer):例外が発生した場合でも、リソースは確実にクローズされます。
  • よりクリーン(Cleaner):明示的な close() の呼び出しを記述する必要がありません。
  • コードの短縮(Shorter code):ボイラープレート(定型的なコード)が減り、可読性が向上します。