例外修羅道 Step09:getMessageとスタックトレースで原因を追え

0004_例外修羅道-step09 learn

まずは問題を見ろ

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


問題のポイント

  • 例外が起きたとき、**「何が起きたのか」だけでなく「どこで起きたのか」**まで把握できるか?
  • getMessage() は概要、printStackTrace() は詳細ログ。両方出せて初めて、例外を“見た”ことになる。
  • **ユーザーに伝える情報と、開発者が追う情報は違う。**その線引きを意識せよ。

まず、日本語で考えろ

たとえば突然プログラムが止まったとき、
「どこで落ちたかわからん」じゃ話にならん。
最低限のヒントを出すだけじゃなく、ログで痕跡を残す
それが printStackTrace() の出番や。


コメントを書け

// 配列から値を取り出して割り算をする
// 例外が発生した場合、メッセージとスタックトレースを出力する
// エラーの種類に関係なく catch(Exception e) でまとめて処理する

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

public class ExceptionUtil {

    public static void traceError(int[] array, int index, int divisor) {
        try {
            int value = array[index];
            int result = value / divisor;
            System.out.println("計算結果: " + result);
        } catch (Exception e) {
            System.out.println("エラーが発生しました");
            System.out.println("原因: " + e.getMessage());
            e.printStackTrace(); // 詳細な例外の履歴(開発者用)
        }
    }
}
public class Main {
    public static void main(String[] args) {
        int[] data = {10, 20, 30};
        ExceptionUtil.traceError(data, 1, 5);   // 正常
        ExceptionUtil.traceError(data, 5, 2);   // インデックスエラー
        ExceptionUtil.traceError(data, 0, 0);   // ゼロ除算
    }
}

実行結果の例(例外発生時)

エラーが発生しました  
原因: / by zero  
java.lang.ArithmeticException: / by zero  
    at ExceptionUtil.traceError(ExceptionUtil.java:5)  
    at Main.main(Main.java:6)  
...

コードの解説

  • e.getMessage() → 例外の「ひとこと説明」だけを取り出す
  • e.printStackTrace()どのクラスのどのメソッドで例外が起きたかの履歴をすべて出す
  • ユーザーには getMessage()、開発者には printStackTrace()この使い分けが肝
  • これがあるかないかで、デバッグ効率が100倍変わる

つまづきやすいポイント

  • printStackTrace()標準エラー出力に出る(標準出力と違う)
  • 本番環境では、これをログファイルにリダイレクトするのが一般的(Log4jなど)
  • 「Messageだけで十分でしょ?」→ 足りん。現場じゃ**“どこで何が起きたか”**が命や

// tesh:
// バグは、必ずどこかに痕跡を残す。
// その痕跡を見つけるための道具が printStackTrace() や。
// 
// 表向きはエラーメッセージ、
// 裏ではログを刻む。
// それが「例外処理の二枚舌」ってやつやな。
// 
// Just keep typing, baby.
// 例外は消すな。刻め。痕跡は、力や。

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