Javaのtry-with-resourcesをわかりやすく

プログラミング

Javaの例外処理を記述する際に,たまに出てくる「try-with-resources」.
私もあまり理解できていなかったので,ブログにまとめつつ学習していきます.
ここでは,「try-catch-finally」を知っていることを前提として話を進めます.

「try-with-resources」とは

例外処理(Exception)とは,プログラム内でエラーが起きた場合に実行する処理のことです.例えば,あるファイルを開いて処理をしている際にエラーが発生した場合.その例外をcatchしてエラー処理を行う必要があります.

ここで考えなければいけないことが,開いているファイルに関する処理です.通常,ファイルを操作する際はファイル(リソース)を確保し,操作が終了したらファイル(リソース)を解放しなければいけません.
しかし,エラーが発生した際にはこの一連の流れが中断され,ファイルが解放できなくなる可能性があります.(catch文やfinally文に解放する処理を記述していればいいのですが)

そこで活躍するのが「try-with-resources」です.「try-with-resources」を使用することで,tryの際に確保したリソースを,自動で解放してくれます.

実際のプログラム

ここでは実際のプログラムを見つつ,使い方を学習していきます.
下記のプログラムは,example.txtを開き,ファイル内に保存されている文字列を1行ずつ表示するプログラムです.

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

public class TryWithResourcesExample {
    public static void main(String[] args) {
        String filePath = "example.txt"; // 読み取るファイルのパス

        // try-with-resourcesを使用してファイルを読み取る
        try (BufferedReader br = 
          new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ここで見ていただきたのが,try文の括弧内です.「try-catch」では,try文の中もしくはtry文の外でインスタンスを生成していました.しかし,「try-with-resources」ではtry文の括弧内にインスタンスを生成するプログラムを記述しています.
この記述により,try文内でエラーが起きた場合は,try文の括弧内で確保したリソースを全て解放します.つまり,リソースの解放をするエラー文を書かずとも自動でリソースの解放をしてくれるのです.
また,try文の括弧内では複数のリソースを確保することができます.その場合は,以下のように宣言します.

try (
  BufferedReader br1 = new BufferedReader(new FileReader(filePath));
  BufferedReader br2 = new BufferedReader(new FileReader(filePath));
){}...

リソースを確保するプログラムを書く際は,是非「try-with-resources」を活用してみましょう.

コメント

タイトルとURLをコピーしました