Java スタックトレースの見方




プログラマは、日々バグと戦っています♪
バグが無いプログラムはありません(; ・`д・´)
「バグが無い」のは、たまたまそのオペレーション(操作)が、期待した動作をするロジックを通過(バグを避けて動いた)しただけのことですw

バグは、「書いた人の力量(発生頻度) x 書いた量(ライン数)」に比例して、だいたい発生します。
バグが出ることを気にしてはいけません。いっぱい書いたから出ただけだと思うことにしましょう。
力量は、誰でもいつかあがるものです。

バグが出て迷惑を掛けたら、素直に謝りましょうw
みんな経験していることです。

NullPointerExceptionをトレースするサンプル

mainで例外が起きてもつまらないので、いくつかのメソッドを呼んだ先でNullPointerExceptionを起こします。
発生した例外は、mainメソッドで捕捉して、スタックトレースを標準出力します。

実行結果

NullPointerExceptionが発生。発生した例外のスタックトレースが表示されます。

サンプルが出力したスタックトレースの解説(見方)

スタックトレースを見るとどのように動いたかがわかります。
メソッドを呼ぶと、呼び出した側のメソッドはそこで止まり、呼ばれたメソッドが動き出します。
これがどんどん上に積まれていく(スタックする)状態を出力したものが、このスタックトレースになります。

このサンプルのスタックトレースから、次のことがわかります。

  1. StackTraceTest.mainを処理していたら4行目で、StackTraceTest.executeを呼び出した
  2. StackTraceTest.executeを処理していたら11行目で、StackTraceTest.subを呼び出した
  3. StackTraceTest.subを処理していたら15行目で、StackTraceTest.subsubを呼び出した
  4. StackTraceTest.subsubを処理していたら19行目で、StackTraceTest.subsubsubを呼び出した
  5. StackTraceTest.subsubを処理していたら24行目で、java.lang.NullPointerExceptionが起きた

注目すべき直接の原因は、どの例外「1行目:java.lang.NullPointerException」が、どこ「2行目:at StackTraceTest.subsubsub(StackTraceTest.java:26)」で起きたかになります。

ですが、発生した箇所にたどり着く経路が1つとは限りません。
そこにどうやってたどり着いたかは、その下を見ていくことで確認をすることができます。

たとえば、横浜駅から品川駅にたどり着くためには、いくつも経路があります。
京急線で行けても、JRで行ったら駅構内で大渋滞ってこともあるのです♪

スタックトレースを文字列で取得するには?

スタックトレースを文字列で取得する方法は、こちらを見てください。

Java StringWriterクラスを使って、スタックトレースを文字列で取得する

2020.03.12