3
1

導入

今回はJava7以降で使用可能なtry-with-resources文について紹介していきます。
これは以前のこちらの記事で触れた「入出力ストリーム」における課題を解決するのに向いているので、ぜひ参考にしてください。

try-with-resources文の紹介

プログラムでファイルやネットワーク接続、データベースなどを利用する際、リソースの管理は非常に重要です。特に、リソースを使い終わった後の「クローズ処理」を忘れると、メモリリークや他の問題の原因になります。

従来の方法では、finally句で手動でリソースを閉じる必要がありましたが、Java 7から導入されたtry-with-resources文を使えば、リソースの自動解放が可能になります。これにより、コードが簡潔になり、クローズ処理の記述漏れを防ぐことができます。

1. 従来のtry-finallyによるリソース管理

従来のリソース管理では、次のようにtry-finallyを使います。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SampleIO {
    public static void main(String[] args) {
        String str = "";
        System.out.println("「;;」と入力し、Enterを押して入力終了");
        BufferedReader br = null;

        try {
            // ストリームの生成
            br = new BufferedReader(new InputStreamReader(System.in));
            while (!str.equals(";;")) {
                System.out.println("入力: ");
                str = br.readLine();
                // 入力値のコンソール出力
                System.out.println("入力値: " + str);
            }
        } catch (IOException e) {
            // 例外処理
            e.printStackTrace();
        } finally {
            // ストリームのクローズ
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

このコードの問題点は、クローズ処理の冗長さです。クローズ処理を手動で記述する必要があり、忘れやすく、バグの原因になりがちです。

2. try-with-resourcesによる簡潔なリソース管理

Java 7以降、try-with-resources文を使えば、リソースのクローズ処理を自動化できます。次の例では、try-with-resourcesを使ってリソース管理を簡潔にしています。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SampleIO {

    public static void main(String[] args) {
        String str = "";
        System.out.println("「;;」と入力し、Enterを押して入力終了");

        // tryのあとの()の中でストリーム生成
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {

            while (!str.equals(";;")) {
                System.out.println("入力: ");
                str = br.readLine();
                // 入力値のコンソール出力
                System.out.println("入力値: " + str);
            }
        } catch (IOException e) {
            // 例外処理
            e.printStackTrace();
        }
    }
}

try-finallyと比べて、try-with-resourcesfinally句を省略し、リソースの生成をtry()内に記述するだけで、リソースが自動的にクローズされます。これにより、コードがすっきりし、バグのリスクを減らすことができます。

3. Java 9以降の書き方

Java 9以降では、次のようにtryの前でリソースを生成し、そのオブジェクトをtry()内で管理することもできます。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SampleIO2 {

    public static void main(String[] args) {
        String str = "";
        System.out.println("「;;」と入力し、Enterを押して入力終了");

        // tryの前でストリーム生成
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // tryの()内にストリームを設定
        try (br) {
            while (!str.equals(";;")) {
                System.out.println("入力: ");
                str = br.readLine();
                // 入力値のコンソール出力
                System.out.println("入力値: " + str);
            }
        } catch (IOException e) {
            // 例外処理
            e.printStackTrace();
        }
    }
}

tryの前でリソースを生成し、それを()内で管理することで、さらに柔軟なコード記述が可能です。

最後に

try-with-resources文の最大のメリットは、自動的にリソースを解放してくれる点です。これにより、クローズ処理を忘れる心配がなくなり、コードの可読性と保守性が大幅に向上します。特に複雑なリソース管理が必要なプログラムでは、この機能を積極的に活用することをお勧めします。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1