理系学生日記

おまえはいつまで学生気分なのか

スタックトレースの出力が省略されてると思ったそのときに

よくあったんですよ、手元で例外が発生して原因を辿るためにスタックトレースを辿ってたら、おやおや、「... 3 more」とか出てて、原因が辿れねーぞっていうケース。

 HighLevelException: MidLevelException: LowLevelException
         at Junk.a(Junk.java:13)
         at Junk.main(Junk.java:4)
 Caused by: MidLevelException: LowLevelException
         at Junk.c(Junk.java:23)
         at Junk.b(Junk.java:17)
         at Junk.a(Junk.java:11)
         ... 1 more
 Caused by: LowLevelException
         at Junk.e(Junk.java:30)
         at Junk.d(Junk.java:27)
         at Junk.c(Junk.java:21)
         ... 3 more

... 3 more じゃねーんだオイ、おれはその more を見てぇんだよ、そうしないと原因が分かねーだろが。

もうね、ぼくが悪かった。無知は罪ですごめんなさい。スタックトレースを全出力する JVM のオプションがあるんじゃない???とかしたり顔で言ったりして本当にすみませんでした。反省しております。

文字"..."を含む行が存在することに注目してください。これらの行は、この例外のスタック・トレースの残りが、この例外により引き起こされた例外のスタック・トレースの下からのフレーム数と一致することを示します。通常の(「原因となる例外」をキャッチするのと同じメソッドからラップされた例外がスローされる)場合、この短縮形を使用することで、出力の長さを大幅に短縮できます。上の例は、次のプログラムを実行することで生成されます。

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Throwable.html#printStackTrace--

ちゃーんと Javadoc に書いてあったんですね。省略は省略でも、「出力が重複してるから省略」してたってこと。Java は偉いよ。ホントえらい。 Java に対して無知すぎる。なんとかしていきたい。