プログラマは、日々バグと戦っています♪
バグが無いプログラムはありません(; ・`д・´)
「バグが無い」のは、たまたまそのオペレーション(操作)が、期待した動作をするロジックを通過(バグを避けて動いた)しただけのことですw
バグは、「書いた人の力量(発生頻度) x 書いた量(ライン数)」に比例して、だいたい発生します。
バグが出ることを気にしてはいけません。いっぱい書いたから出ただけだと思うことにしましょう。
力量は、誰でもいつかあがるものです。
バグが出て迷惑を掛けたら、素直に謝りましょうw
みんな経験していることです。
NullPointerExceptionをトレースするサンプル
mainで例外が起きてもつまらないので、いくつかのメソッドを呼んだ先でNullPointerExceptionを起こします。
発生した例外は、mainメソッドで捕捉して、スタックトレースを標準出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class StackTraceTest { public static void main(String[] args) { try { new StackTraceTest().execute(); }catch(Exception e) { e.printStackTrace(); } } public void execute() { sub(); } public void sub() { subsub(); } public void subsub() { subsubsub(); } public void subsubsub() { String a = null; a.substring(0); //ここでNullPointer } } |
実行結果
NullPointerExceptionが発生。発生した例外のスタックトレースが表示されます。
1 2 3 4 5 6 | java.lang.NullPointerException at StackTraceTest.subsubsub(StackTraceTest.java:24) at StackTraceTest.subsub(StackTraceTest.java:19) at StackTraceTest.sub(StackTraceTest.java:15) at StackTraceTest.execute(StackTraceTest.java:11) at StackTraceTest.main(StackTraceTest.java:4) |
サンプルが出力したスタックトレースの解説(見方)
スタックトレースを見るとどのように動いたかがわかります。
メソッドを呼ぶと、呼び出した側のメソッドはそこで止まり、呼ばれたメソッドが動き出します。
これがどんどん上に積まれていく(スタックする)状態を出力したものが、このスタックトレースになります。
このサンプルのスタックトレースから、次のことがわかります。
- StackTraceTest.mainを処理していたら4行目で、StackTraceTest.executeを呼び出した
- StackTraceTest.executeを処理していたら11行目で、StackTraceTest.subを呼び出した
- StackTraceTest.subを処理していたら15行目で、StackTraceTest.subsubを呼び出した
- StackTraceTest.subsubを処理していたら19行目で、StackTraceTest.subsubsubを呼び出した
- StackTraceTest.subsubを処理していたら24行目で、java.lang.NullPointerExceptionが起きた
注目すべき直接の原因は、どの例外「1行目:java.lang.NullPointerException」が、どこ「2行目:at StackTraceTest.subsubsub(StackTraceTest.java:26)」で起きたかになります。
ですが、発生した箇所にたどり着く経路が1つとは限りません。
そこにどうやってたどり着いたかは、その下を見ていくことで確認をすることができます。
たとえば、横浜駅から品川駅にたどり着くためには、いくつも経路があります。
京急線で行けても、JRで行ったら駅構内で大渋滞ってこともあるのです♪