【Java】エラー(スタックトレース)を文字列として取得する方法


Posted on 2022/2/28 at 0:50


Javaに限らずプログラミングをしている人なら必ず遭遇するエラーですが、プログラムのどこに問題があるのかを特定するために非常に重要な情報です。 printStackTraceメソッドによってスタックトレースをコンソール上に出力することが可能ですが、GUIアプリケーションを作っているとスタックトレースをダイアログなどに出力したい 場面が出てきます。その際必要なスタックトレースを文字列として取得する方法について紹介いたします。

サンプルコード

		public class StackTraceSample {
	public static void main(String[] args) {
		try {
			Integer a = null;
			a.toString();
		} catch (Exception e) {
			System.out.println(getStackTrace(e));
		}
	}
	private static String getStackTrace(Exception e) {
		StackTraceElement[] list = e.getStackTrace();
		StringBuilder b = new StringBuilder();
		b.append(e.getClass()).append(":").append(e.getMessage()).append("\n");
		for( StackTraceElement s : list ) {
			b.append(s.toString()).append("\n");
		}
		return b.toString();
	}
}
		

プログラムをやっていれば必ず目にする例外「NullPointerException」をわざと発生させるプログラムです。例外が発生した場合はcatch構文の 中に処理を書きます。getStackTraceメソッドでスタックトレースを文字列として取得します。今回は取得した文字列を標準出力に出力しているだけなので、 e.printStackTrace()と同じ事をしているだけですが、取得したスタックトレースをダイアログなどに表示する場合には有効です。

		class java.lang.NullPointerException:null
stacktrace.StackTraceSample.main(StackTraceSample.java:8)
		

サンプルコードを実行して出力されたスタックトレースを見ると、StackTraceSampleクラスの8行目でNullPointerExceptionが発生したという内容の メッセージだという事がわかります。サンプルコードの8行目を確認すると、a.toString()となっています。前の行で変数aにNULLをセットしておりNULLを文字列に 変換しようとしているためエラーとなっているので、ここを修正すればよい事がすぐにわかります。