例外修羅道 Step03:複数の例外を個別に処理せよ

0004_例外修羅道-step03 learn

まずは問題を見ろ

javadrill.tech で出題された問題を見る(Step03)


問題のポイント

  • 複数の例外が発生する可能性がある処理では、catchを分けることができる。
  • それぞれの catch ブロックで、例外の種類に応じた適切な処理ができているか?
  • 「全部 Exception にまとめてcatch」はまだ早い。このステップでは“分けて”処理しろ。

まず、日本語で考えろ

  1. 配列の中から、指定されたインデックスの値を取り出す
  2. 取り出した値を、指定された数で割る

この2つをやろうとすると:

  • インデックスが範囲外なら → ArrayIndexOutOfBoundsException
  • 割る数が0なら → ArithmeticException

つまり、「どちらの例外が起きたか」で、対応が変わる。


コメントを書け

// 配列の指定インデックスの値を取り出して、割り算を行う
// インデックスが範囲外なら catch 1、除数が0なら catch 2
// 正常な場合は、値と計算結果を出力する

コメントに従ってコードを書け

public class ExceptionUtil {

    public static void process(int[] array, int index, int divisor) {
        try {
            // 配列から値を取り出す
            int value = array[index];
            System.out.println("選ばれた値: " + value);

            // 割り算を行う
            int result = value / divisor;
            System.out.println("計算結果: " + result);

        } catch (ArrayIndexOutOfBoundsException e) {
            // 配列のインデックスが範囲外だった場合
            System.out.println("エラー: インデックスが範囲外です");

        } catch (ArithmeticException e) {
            // 割る数が0だった場合
            System.out.println("エラー: ゼロによる除算です");
        }
    }
}

実行結果の例

process({10, 20, 30}, 2, 10); → 選ばれた値: 30 / 計算結果: 3  
process({10, 20, 30}, 5, 2); → エラー: インデックスが範囲外です  
process({10, 20, 30}, 1, 0); → 選ばれた値: 20 / エラー: ゼロによる除算です

コードの解説

  • try ブロックの中で複数の処理をまとめて書き、複数の catch を使ってそれぞれの例外に分岐させている
  • 最初に配列アクセス、次に除算、という順番の中で何が起きるかを観察することがポイント
  • catch を分けることで、「何が起きたか」に応じた適切な処理とメッセージを出せるようになる

つまづきやすいポイント

  • 最初に ArrayIndexOutOfBoundsException が起きたら、割り算の処理には進まない(処理はそこで止まる)
  • catch (Exception e) で全部まとめたくなるが、それは次のステップ
  • 例外の発生順・処理の流れを逐一追いかける癖をつけろ

// tesh:
// 「catch を分ける意味ってあるの?」
// ──あるに決まってんだろ。
// 
// 何が起きたかを把握して、
// 何が起きても止まらず、
// しかも意味のある対応ができる。
// 
// それが例外処理の本質や。
// 全部まとめてcatchしてたら、成長は止まる。
// 
// Just keep typing, baby.
// 分けて、捉えて、制御しろ。それが流れを保つ唯一の方法や。

例外修羅道:全体のステップ構成はこちら