Javaアプリケーションで例外(java.lang.Throwableのインスタンス)がスローされた場合などに出力されるスタックトレースは、エラーが発生するまでの経緯(メソッドの呼び出し順番)が示されています。このスタックトレースを解析すると、エラーが発生した箇所と原因を確認できます。
スタックトレースの出力先
スタックトレースの出力先は、標準エラーです。通常のJavaアプリケーションの場合は、コンソールに出力されますが、Servlet/JSP/EJBアプリケーションの場合は、ログファイル(標準出力、標準エラー出力またはJava VMの出力を格納するファイルなど)に出力されます。
スタックトレースの出力方法
Javaでスローされた例外をcatch節でキャッチし、例外のprintStackTraceメソッドを実行することで、スタックトレースを出力できます。
スローされた例外をtry-catch構文で処理するメソッドがスレッドにない場合、そのスレッドは停止され、Java VMによってスタックトレースが出力されます。
ポイント
java.lang.Throwable.printStackTrace()メソッドでスタックトレースを出力する方法
try { SampleBMPSessionRemote bmpSessionRemote = bmpSessionHome.create(); } catch(Exception e) { e.printStackTrace(); } |
スタックトレースの出力形式
例外クラス名: エラーメッセージ at クラス名.メソッド名1(ソース名:行番号) 呼び出し先 at クラス名.メソッド名2(ソース名:行番号) : : at クラス名.メソッド名N(ソース名:行番号) 呼び出し元 |
最初の1行目は、スローされた例外のクラス名とエラーメッセージです。
エラーメッセージがない場合もあります。
2行目以降は、メソッドの呼び出し元(クラス名.メソッド名N)から呼び出し先(クラス名.メソッド名1)に向かって下から上に出力されます。
2行目(クラス名.メソッド名1)が、例外をスローしたメソッドの情報です。
"メソッド名"が"<init>"の場合、コンストラクターを示します。
"メソッド名"が"<clinit>"の場合、static initializerを示します。
"(ソース名:行番号)"が"(Native Method)"の場合、Javaのネイティブメソッド(.soや.dllファイル)を示します。
クラスのコンパイル時にデバッグ情報を削除した場合、"(ソース名:行番号)"には、ソース名しか表示されなかったり、"Unknown Source"と表示されたりする場合があります。