まずは問題を見ろ
→ 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.
// 例外は消すな。刻め。痕跡は、力や。