最近、NullPointerException を引き起こすバグを発見しました。例外は、標準の slf4j ステートメントを使用してキャッチされ、ログに記録されます。以下の要約コード:
for(Action action : actions.getActions()) {
try {
context = action.execute(context);
} catch (Exception e) {
logger.error("...", e);
break;
}
}
ご覧のとおり、派手なものは何もありません。ただし、すべての例外ログ ステートメントのうち、スタック トレースを出力しないのはこの 1 つだけです。出力されるのは、メッセージ ("..." で表される) と例外クラスの名前 (java.lang.NullPointerException) だけです。
例外のスタック トレースは遅延ロードされるため、何らかの命令の並べ替えの問題があるのではないかと考え、ログ ステートメントの前に e.getStackTrace() を呼び出すことにしました。これは違いはありませんでした。
そこで、デバッグ エージェントを有効にして再起動することにしました。しかし、私もプロセスにアタッチしたため、スタック トレースが印刷されていることに気付きました。明らかに、デバッグ エージェントの存在により、いくつかの追加のデバッグ情報が利用可能になりました。
それ以来、例外の根本原因を修正しました。しかし、デバッガーなしでスタック トレースを利用できなかった理由を知りたいと思います。誰でも知っていますか?
明確化:これはロギングの問題ではありません。同じ try/catch 句を想像してみてください。ただし、catch では、次の値を出力します。
e.getStackTrace().length
デバッガーがない場合、これは「0」を出力します。デバッガーを使用すると、正の数 (この場合は 9) が出力されます。
詳細: これは JDK 1.6.0_13、64 ビット、amd64、linux 2.6.9 で発生しています。