とりあえずバグったら困ったら見るものといえば、スタックトレース。
ログファイルを見て確認してみたり、ちょっとしたプログラムだったらコンソールで確認してみたり・・で済むんですが。。
特定の場所だけ見たかったり、見やすいように整形したかったりして、文字列で欲しくなることがあります。
そんなときは、StringWriterクラスを使って、スタックトレースを文字列にしてしまいましょう。
StringWriterクラスを使って、スタックトレースを文字列で取得するサンプル
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; public class StackTraceTest { public static void main(String[] args) { try { new StackTraceTest().test1(); }catch(Exception e) { String stackTrace = getStackTrace(e); System.out.println(stackTrace); } } public void test1() throws Exception { test2(); } public void test2() throws Exception { test3(); } public void test3() throws Exception { throw new Exception("例外を投げてみた"); } public static String getStackTrace(Exception e) { try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) { e.printStackTrace(pw); return sw.toString(); } catch (IOException ioe) { ioe.printStackTrace(); return null; } } } |
実行結果
1 2 3 4 5 | java.lang.Exception: 例外を投げてみた at StackTraceTest.test3(StackTraceTest.java:27) at StackTraceTest.test2(StackTraceTest.java:23) at StackTraceTest.test1(StackTraceTest.java:19) at StackTraceTest.main(StackTraceTest.java:10) |
サンプルの解説
Exception#printStackTrace(PrintWriter)で、指定したストリームに出力することができます。
これを使って、StringWriterに流し込みます。
流し込んだスタックトレースは、StringWriter#toString()にて、文字列として取得することができます。
ちなみに、すぐに例外を出しても面白くないと思ったので、test1~test3まで無意味に呼び出してから例外を投げてますw