1. 10 を 2 で割ると 5
  2. 10 を 0 で割るとゼロ除算で -2
  3. abc は数値にパースできないので -1
  4. 第二引数 xyz もパース失敗で -1
  5. -10 を 2 で割ると -5 (整数除算)
  6. 7 を 2 で割ると整数除算で 3
コース一覧
Java 中級:コレクション・Stream・例外処理
複数の catch ブロック

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分

複数の catch ブロック

「エラーが出ました」だけでは、直しようがない

在庫数から「1 人あたり何個配れるか」を出す処理を考えます。ここで失敗する理由は 2 つあります。指定された商品番号が存在しないか、在庫が 0 で割り算ができないかです。

Java

try { System.out.println(names[i] + " は 1 人あたり " + (100 / stock[i]) + " 個"); } catch (Exception e) { System.out.println("エラーが出ました"); }

これでも落ちはしません。ただ、画面に出るのは毎回「エラーが出ました」だけです。使う人は、番号を打ち直せばいいのか、在庫を補充すればいいのかが分かりません。例外を捕まえる目的は、落とさないことだけではなく、何が起きたのかを正しく区別して伝えることにあります。

catch は縦に並べられる

1 つの try に対して、catch は何個でも並べられます。投げられた例外の型に当てはまる最初の catch が実行されます。

Java

try { System.out.println(names[i] + " は 1 人あたり " + (100 / stock[i]) + " 個"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("その番号の商品はありません"); } catch (ArithmeticException e) { System.out.println("在庫が 0 なので計算できません"); }

これで、番号が範囲外なら前者、在庫が 0 なら後者のメッセージが出ます。原因ごとに違う手当てができるようになりました。

並べる順番には決まりがあります。狭い型を先、広い型をあとに書きます。catch (Exception e) を先頭に置くと、その下の catch には二度と処理が届かないので、コンパイラが exception has already been caught と言って止めてくれます。

手当てが同じなのに、同じコードを 2 回書きたくない

原因が違っても、やることが同じ場合があります。「どちらの失敗でも、その行を飛ばしてログに残すだけ」といったケースです。このときは | で例外型を並べて 1 つの catch にまとめられます。

Java

try { importRow(row); } catch (ArrayIndexOutOfBoundsException | ArithmeticException e) { System.out.println("この行は飛ばします " + e.getMessage()); }

この書き方の中では、e は並べた型の共通の親として扱われます。ここでは RuntimeException なので、getMessage() のような共通のメソッドは呼べますが、どちらか一方にしかないメソッドは呼べません。

| で並べられるのは、親子関係にない型どうしだけです。catch (IOException | FileNotFoundException e) は、後者が前者の子なのでコンパイルエラーになります。

よくある間違い

「とりあえず広い網を張っておこう」と catch (Exception e) を先頭に書いてしまうのが定番のつまずきです。エラーメッセージだけ見ても意味が分かりにくいので、catch が並んでいるコードで急にビルドが通らなくなったら、まず順番を疑ってください。

もう 1 つ、戻り値や処理内容が違うのに | でまとめてしまうのも避けたいところです。まとめるのは手当てが同じときだけ、と決めておくと迷いません。

要件

  1. クラス名は Solution、メソッド名は safeDivide、引数は String a, String b、戻り値の型は int
  2. try の中で Integer.parseInt を 2 回呼んでから割り算を行い、NumberFormatException を捕まえる catch で -1 を返すこと
  3. もう 1 つの catch で ArithmeticException を捕まえて -2 を返すこと。Exception でひと括りにせず、種類ごとに別々の catch で書き分けること

入出力例

safeDivide("10", "2") → 5 safeDivide("10", "0") → -2 safeDivide("abc", "2") → -1 safeDivide("10", "xyz") → -1 safeDivide("-10", "2") → -5 safeDivide("7", "2") → 3

ヒント

`Integer.parseInt("abc")` を呼ぶと `NumberFormatException` が投げられます。`try` の中で `int x = Integer.parseInt(a);` のように書きましょう

整数同士の割り算で割る数が `0` だと `ArithmeticException` が発生します。`catch (ArithmeticException e)` で受け取って `-2` を返します

`catch` の順序は具体 → 抽象が原則ですが、今回の 2 つはどちらも `RuntimeException` の直接の子クラスなので、`NumberFormatException` → `ArithmeticException` の順で並べれば OK です

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

関連レッスン

  • throws と例外の伝播

    `throws` キーワードと検査例外の伝播を学び、`Integer.parseInt` の失敗を `try-catch` で受け止めて 0 を返す `safeParse` メソッドを実装してみよう。

  • 独自の例外を作る

    Java の例外クラスを継承して独自の `InsufficientFundsException` を作り、銀行口座の出金処理で `throw` / `catch` する流れを学んでみよう。

  • try-with-resources

    AutoCloseable なリソースを安全に扱う try-with-resources 構文を学び、リソースの自動クローズを体験しよう。

  • finally ブロック

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

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

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

  • 処理計算や代入を表す長方形
  • メソッドクラスに属する関数
  • コンパイルソースをバイトコードへ変換する処理
  • エラーメッセージプログラムが出す失敗の通知
  • 戻り値呼び出し元への返答を表す点線矢印
  • クラスデータと振る舞いを束ねる単位
  • 引数位置引数=順番で渡す。
main.java
学習モード
エディタを読み込んでいます

メモ

複数の catch ブロック

⌘S で保存