1. 10 / 2 は 5 で、finally の ,end が末尾に付く
  2. 10 / 0 で ArithmeticException、catch の error と finally の ,end
  3. 9 / 3 は 3 で、finally の ,end が末尾に付く
  4. 20 / 4 は 5 で、finally の ,end が末尾に付く
  5. 7 / 0 で ArithmeticException、catch の error と finally の ,end
コース一覧
Java 中級:コレクション・Stream・例外処理
finally ブロック

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分

finally ブロック

いちばん記録が欲しい回だけ、ログが残らない

夜間バッチの取り込み処理に、開始と終了のログを入れました。

Java

System.out.println("取り込み開始"); importRows(path); System.out.println("取り込み終了");

翌朝ログを見ると、開始だけが記録されて終了が無い日があります。importRows の途中で例外が飛び、その先の行が実行されなかったのです。処理が成功した日はきれいに 2 行そろい、失敗した日だけ片方しか残りません。原因を追いたいのは失敗した日のほうなのに、手がかりがいちばん少なくなるわけです。

catch に同じ行を書き足せば直りますが、catch が 2 つ 3 つと増えれば、そのすべてに同じ行をコピーすることになります。書き忘れた 1 つが、また同じ穴を開けます。

finally は、どの道を通っても必ず寄る

try には catch のほかに finally を付けられます。ここに書いた処理は、try を最後まで走り抜けたときも、catch に飛んだときも、必ず実行されてからメソッドの外に出ます。

Java

long start = System.currentTimeMillis(); try { importRows(path); System.out.println("取り込み成功"); } catch (RuntimeException e) { System.out.println("取り込み失敗 " + e.getMessage()); } finally { System.out.println("所要 " + (System.currentTimeMillis() - start) + " ミリ秒"); }

成功でも失敗でも、所要時間が必ず 1 行残ります。分かれた道が最後に合流する場所、と考えると位置付けがはっきりします。

強いのは、try の中に return があっても通ることです。Java は返す値をいったん控えてから finally を実行し、そのあとで呼び出し元に返します。誰も catch していない例外で抜けていく場合も同じで、finally を通ってから外へ飛んでいきます。

ロックの解放、トランザクションの巻き戻し、実行回数の記録など、close() 一発では済まない後始末はここに置きます。ファイルや接続を閉じるだけなら、try-with-resources のほうが短く書けます。

finally に return を書くと、例外が消える

便利な場所なので、つい戻り値まで置きたくなります。これが最大の落とし穴です。

Java

public static int broken() { try { throw new IllegalStateException("本当の原因"); } finally { return -1; } }

呼び出し元に届くのは -1 だけです。IllegalStateException はどこにも現れません。finally の return が、飛んでいくはずだった例外を押し流してしまうからです。try の中に return があった場合も同じように上書きされます。

同じ理由で、finally の中で新しい例外を投げるのも避けてください。元の例外が上書きされて、本当の原因が消えます。どうしても例外になり得る処理を置くなら、その部分だけ try-catch で包んでログに残しておきます。

finally には後始末だけを書き、return は外に 1 つだけ置く。これを守るだけで、この手のバグはほぼ起きません。

要件

  1. try ブロックの中で a / b を計算し、正常時は "result=" + 商 の文字列を組み立てること
  2. ArithmeticException を catch して、例外時は "error" の文字列を組み立てること
  3. finally ブロック (または finally と同等の最終処理) を用いて、正常時・例外時のいずれでも戻り値の末尾に必ず ",end" を付け加えること

入出力例

trackedDivide(10, 2) → "result=5,end" trackedDivide(10, 0) → "error,end" trackedDivide(9, 3) → "result=3,end" trackedDivide(20, 4) → "result=5,end" trackedDivide(7, 0) → "error,end"

ヒント

`String message;` のように、`try` `catch` の両方から代入できる変数を `try` の外側で宣言しておくと整理しやすいです

整数の商と文字列を連結したいときは `"result=" + (a / b)` のように、`int` をそのまま `+` でくっつければ自動で文字列化されます

`finally` 内で `return` してしまうと例外を握りつぶす落とし穴になるので、`return` は `finally` の外に 1 行だけ書きましょう

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

関連レッスン

  • 例外処理 まとめクイズ

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

  • Stream を作る

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

  • ラムダ式の基本

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

  • String.format で書式化

    `Java` の `String.format` で `%s` `%d` `%,d` `%.2f` などの書式指定子を使い、整形された文字列を組み立てる方法を学ぼう。

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

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

  • 処理計算や代入を表す長方形
  • メソッドクラスに属する関数
  • ロック「他の人触らないでね」と DB に予約する
  • トランザクション「全部成功 or 全部なかったことに」をまとめる単位
  • 戻り値呼び出し元への返答を表す点線矢印
main.java
学習モード
エディタを読み込んでいます

メモ

finally ブロック

⌘S で保存