メインコンテンツにスキップ
モジュール 5 · レッスン 2 / 2コース内の 10/14~12 min
モジュールのレッスン (2/2)

リソースを試す

古いバージョンの Java では、明示的に閉じる必要があるリソース (ファイル、データベース接続、ネットワーク ストリームなど) を管理するには、リソースが確実に閉じられるようにするために必須の finally ブロックが必要でした。これにより、冗長でリークが発生しやすいコードが生成されました。

Java 7 では try-with-resources ステートメントが導入されました。これは、AutoCloseable インターフェイスを実装している場合に、try ブロック内で宣言されたすべてのリソースの自動クローズを保証します。

構文

リソースは、try キーワードの直後に括弧内で宣言および初期化されます。

Java
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    String line = br.readLine();
    System.out.println(line);
} catch (IOException e) {
    System.out.println("I/O Error: " + e.getMessage());
}
// br is closed automatically here, even if an exception occurs

複数のリソースの宣言

同じ try ブロック内で複数のリソースをセミコロン ; で区切ってインスタンス化できます。リソースは宣言とは逆の順序で閉じられます。

Java
try (
    FileReader fr = new FileReader("input.txt");
    FileWriter fw = new FileWriter("output.txt")
) {
    // Use resources
} catch (IOException e) {
    System.out.println("Error: " + e.getMessage());
}

カスタムリソースの作成

カスタム リソースは、java.lang.AutoCloseable を実装し、close() メソッドをオーバーライドする限り、try-with-resources ブロックで使用できます。

Java
public class DatabaseConnection implements AutoCloseable {
    public void query(String sql) {
        System.out.println("Running query: " + sql);
    }

    @Override
    public void close() {
        System.out.println("Connection closed!");
    }
}

自分で試してみてください

運動#java.m5.l2.e1
試行回数: 0読み込み中…

try-with-resources ステートメントを使用して readFile メソッドを完了し、パス上の FileReader をラップする BufferedReader を初期化します。 catch ブロックで IOException をインターセプトし、「ファイル読み取りエラー」を出力します。

エディターを読み込み中…
ヒントを表示

tryの直後に括弧内にBufferedReaderを宣言し、IOExceptionのハンドリングを実装します。

3 回の試行後に解決策が利用可能になります

運動#java.m5.l2.e2
試行回数: 0読み込み中…

try-with-resources ブロック内でカスタム リソース CustomResource をインスタンス化し、その上で doWork() メソッドを呼び出し、「Error」を出力して例外を処理します。

エディターを読み込み中…
ヒントを表示

`try (CustomResource res = new CustomResource())` を使用し、その中で `res.doWork();` を呼び出します。

3 回の試行後に解決策が利用可能になります

運動#java.m5.l2.e3
試行回数: 0読み込み中…

同じ try-with-resources 構造で FirstResource と SecondResource の両方を宣言します。 「エラー」を出力して例外を処理します。

エディターを読み込み中…
ヒントを表示

`try` の括弧内の 2 つのリソースの宣言をセミコロン `;` を使用して区切ります。

3 回の試行後に解決策が利用可能になります