例外が発生した時に、printStackTraceメソッドが出力するスタックトレースを見ると、どのような過程を経て該当個所が呼び出されているかが分かります。このTipsでは、例外が発生していない個所でそのような情報を得る方法を紹介します。
例外の処理がとくに決まっていないときに,スタックトレースを表示することがあります。
デバッグ時には,スタックトレースが有効な情報となることが多いのですが,例外が発生していないケースでもスタックトレースが知りたいことがあります。やや特殊なケースを含めて,次のようなケースがあげられます。
これ以外にも,動作をチェックするうえで呼び出しの過程をたどれると得られる情報は多いため,任意のタイミングでスタックトレース情報を取得できるとなにかと便利です。ここでは,スタックトレースを生成することで呼び出し過程を調べる方法を紹介しましょう。
さっそくですが,スタックトレースは,次のような決まり文句で取得できます。
StackTraceElement stack[] = (new Throwable()).getStackTrace(); int i = 0; while (i < stack.length) { StackTraceElement frame = stack[i]; System.out.println(frame.getClassName() + "#" + frame.getMethodName() + "(" + frame.getLineNumber() + ")"); i++; }
ここで登場するStackTraceElementとThrowableは,いずれもjava.langパッケージのクラスです。そのためとくにimportしなくてもかまいません。
1つのStackTraceElementが1つの「メソッド呼び出し」に相当します。このクラスの主要なメソッドを次の表にまとめました。
メソッド | 内容 |
---|---|
getClassName() | 実行ポイントのクラス名(FQCN) |
getFileName() | 実行ポイントのソースファイル名 |
getLineNumber() | 実行ポイントのソースファイルの行番号 |
getMethodName() | 実行ポイントのメソッドの名前 |
表■StackTraceElementクラスの主なメソッド |
この表で,呼び出しを行っている命令のことを「実行ポイント」と呼びます。getLineNumberメソッドだけがintの値を返し,それ以外はStringを返します。これを標準出力に表示するなり,ログに記録するなりするのが一般的でしょう。
なお,クラス名とファイル名が別に取得できる点に注意してください。これは,例えば内部クラスの場合に有効になりますが,getClassNameで完全修飾クラス名(FQCN)が得られるため,通常はこの例のようにクラス名を扱うことになるでしょう。
「JAVA Developer」より毎週役立つJava Tipsを配信中。ほかにも参考になるTipsは、JAVA Developerサイトのバックナンバーから探すことが可能です。
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.