1. try-with-resources で open → use → 自動 close が順に呼ばれて opened-used-closed が返る
コース一覧
Java 中級:コレクション・Stream・例外処理
try-with-resources

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

try-with-resources

close() の行に、たどり着けないことがある

ファイルを開いて 1 行読むだけのコードです。最後にきちんと close() も書いてあります。

Java

BufferedReader reader = new BufferedReader(new FileReader(path)); String line = reader.readLine(); System.out.println(line.trim()); reader.close();

ところが空のファイルを渡すと readLine() が null を返し、line.trim() で NullPointerException が飛びます。処理はその場で打ち切られるので、最後の reader.close() は実行されません。ファイルは開いたままです。

ここが厄介なのは、すぐには何も壊れないことです。ガベージコレクタが片付けてくれるのは Java のヒープの中だけで、OS が持っているファイルハンドルやソケット、データベース接続は close() を呼ぶまで戻ってきません。同じ処理を数千回繰り返したあと、Too many open files でサーバーが止まって初めて気づきます。

finally に移せば例外が出ても呼ばれますが、本筋ではないコードのほうが長くなります。

Java

BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(path)); System.out.println(reader.readLine().trim()); } finally { if (reader != null) { reader.close(); } }

try のかっこに書くと、勝手に閉じてくれる

Java 7 以降は、try の直後のかっこの中でリソースを宣言できます。

Java

try (BufferedReader reader = new BufferedReader(new FileReader(path))) { System.out.println(reader.readLine().trim()); }

これだけです。かっこの中で宣言した変数は try ブロックの中だけで有効で、ブロックを抜けるときに close() が自動で呼ばれます。正常に抜けたときも、途中で例外が飛んだときも同じです。閉じ忘れが構文レベルで起こらなくなったわけです。

かっこの中には、セミコロンで区切って複数のリソースを並べられます。閉じられる順番は宣言と逆順です。あとから開いたものが先に閉じるので、接続の上に文を載せるような依存関係があっても、自然な順序で片付きます。

かっこに書けるのは AutoCloseable だけ

try のかっこに置けるのは、java.lang.AutoCloseable を実装した型に限られます。中身は close() メソッド 1 つだけの、とても小さなインタフェースです。

BufferedReader InputStream Scanner Connection といった標準ライブラリのリソース系クラスは、すべて実装済みです。自分で書いたクラスも implements AutoCloseable と宣言して close() を用意すれば、同じように置けます。実装を忘れると required type that implements AutoCloseable というコンパイルエラーで止まります。

よくある間違い

いちばん多い勘違いは、「これを使えば例外処理そのものが要らなくなる」というものです。自動になるのは close() の呼び出しだけで、ブロックの中で起きた例外はそのまま外へ飛んでいきます。受け止めたいなら catch を書き足してください。かっこと catch は併用できます。

もう 1 つ、close() の中に重い処理や独自の例外を仕込むのも避けましょう。後始末は静かに終わるのが理想です。

要件

  1. Solution の中に static class Resource implements AutoCloseable を定義し、close() メソッドを実装すること
  2. Resource のコンストラクタで "opened"、use() で "-used"、close() で "-closed" を StringBuilder に append すること
  3. try-with-resources 構文 (try (Resource r = new Resource(log)) { ... }) を使い、finally で明示的に close() を呼ばないこと

入出力例

dummyClose() → "opened-used-closed"

ヒント

`static class Resource implements AutoCloseable { ... }` を `Solution` の中に書くと、`Solution.dummyClose()` から `new Resource(log)` で生成できます

`close()` メソッドは `public void close()` のシグネチャで定義します。`throws Exception` は今回は不要です

`try (Resource r = new Resource(log)) { r.use(); }` と書けば、ブロックを抜けるときに `r.close()` が自動で呼ばれます。`return log.toString()` は `try` の外で呼びましょう

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • finally ブロック

    Java の `try` 文で必ず実行される `finally` ブロックの役割をリソース解放や後始末の観点から学び、整数除算の結果を `,end` 付きで返すメソッドを実装してみよう。

  • 例外処理 まとめクイズ

    例外処理 (try-catch / 複数 catch / throws / カスタム例外 / try-with-resources / finally) の総まとめ。検査例外と非検査例外、catch の順序、finally で return など実務頻出のポイントを 4 択クイズで確認する。

  • Stream を作る

    Java の Stream API を学ぶ最初のステップとして、配列やコレクションから Stream を生成し、count などのターミナル操作で要素数を取得するコードを書いてみよう。

  • ラムダ式の基本

    Java 8 から導入されたラムダ式の文法と関数型インターフェースの考え方を学び、Stream と組み合わせて配列の合計を一行で書く感覚を身につけよう。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 処理計算や代入を表す長方形
  • ヒープ親が子より常に大きい(最大ヒープ)または小さい(最小ヒープ)木構造。
  • データベースデータを構造化して保存する仕組み
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • 変数データに名前をつけて参照する仕組み
  • ロック「他の人触らないでね」と DB に予約する
  • メソッドクラスに属する関数
  • 標準ライブラリPythonに同梱の公式モジュール群
main.java
学習モード
エディタを読み込んでいます

メモ

try-with-resources

⌘S で保存