トップ 言語 Java クラスライブラリ printStackTraceの使い方

printStackTraceの使い方―スタックトレースの読み方や標準エラー出力の出し分け方法など。

Javaのスタックトレースの読み方や標準出力や標準エラー出力の出し分け方法など。ThrowableクラスのprintStackTraceメソッドの使い方についてまとめています。

ThrowableクラスのprintStackTraceメソッド

Javaの例外クラスのトップであるThrowableクラスにprintStackTraceメソッドがあります。 Javaの入門書などで例外処理のtry/catch文で、よく見かけるprintStackTraceメソッドです。

printStackTraceメソッドを利用することにより、例外情報を標準エラー出力に出力できます。

などの情報を発生元から呼出元まで積上げ式で出力してくれます。

ちなみに積上げ式の出力のことをスタックトレースといいます。

スタックトレースの読み方3つのポイント

スタックトレースは、例外の発生元とそこまでの経路の情報を詳細に示すもので、デバッグ時に大変役立つ情報となります。

でもぱっと見、読み方が分からない、となってしまう出力ですね。以下の3つを覚えておくと読めると思います。

メソッドの呼出構造とprintStackTraceメソッド、スタックトレースの出力

図は「メソッドの呼出構造とprintStackTraceメソッド、スタックトレースの出力」を表したものです。

printStackTrace()の使い方

例外の詳細なトレース情報に加え、標準エラー出力に出力してくれて、正常時の出力とエラー時の出力を実行時に選択できて便利です。 ちょっとしたアプリケーションの場合、ロガーを使わなくても簡単にログ出力を切りかえられて便利です。

どういうことか、以下のサンプルとその実行方法で説明していきます。

printStackTrace()の使い方を説明するため、簡単なサンプルプログラムを作成していくつかの実行方法を紹介いたします。

サンプルコード

以下では、printStackTrace()を記述したサンプルプログラムです。

public class Sample {

	public static void main(String[] args) {
		int x = 15;
		int y = 0;
		Sample obj = new Sample();
		System.out.println("[INFO] 標準出力:開始します。");

		try {
			obj.divideOpration(x,y);
		} catch (ArithmeticException ae) {
			System.err.println("[ERROR] 標準エラー出力:エラーが発生しました。");
			ae.printStackTrace();
		}
		System.out.println("[INFO] 標準出力:終了します。");
	}

	int divideOpration(int x, int y){
		return x/y;
	}
}

正常時の処理を確認するための、[INFO]ログと例外発生時の[ERROR]ログを記述しています。 [INFO]ログは、おなじみの標準出力を行うSystem.out.println()です。 [ERROR]ログは、System.err.println()を使って、標準エラー出力にしています。

では、いくつかの実行方法で実行していきます。

コンパイル

javac Sample.java

実行1―普通に実行する

実行するとプロンプトにSystem.out.println()の出力もSystem.err.println()の出力もprintStackTrace()の出力も全部出力しますね。

java Sample
[INFO] 標準出力:開始します。
[ERROR] 標準エラー出力:エラーが発生しました。
java.lang.ArithmeticException: / by zero
        at Sample.divideOpration(Sample.java:19)
        at Sample.main(Sample.java:10)
[INFO] 標準出力:終了します。

ご存知かもしれませんが、コマンドラインにはリダイレクトという機能があり、これを使うとプログラムの標準出力の内容をファイルに吐き出せます。

実行2―標準出力の内容をファイルに吐き出す。

以下のように「>」を使用することで標準出力の内容がファイルに吐き出されて、プロンプトに出力されなくなります。

java Sample > sample_info.out
[ERROR] 標準エラー出力:エラーが発生しました。
java.lang.ArithmeticException: / by zero
        at Sample.divideOpration(Sample.java:19)
        at Sample.main(Sample.java:10)

sample_info.outを開くと標準出力の内容が出力されています。

[INFO] 標準出力:開始します。
[INFO] 標準出力:終了します。

ちなみに、「>>」とリダイレクトを2つにすると追加書き込みできます。 ここではやりませんが、試してみてください。

実行3―標準エラー出力の内容をファイルに吐き出す。

今度は標準エラー出力の方をファイルに出力してみます。 その場合は「2>」とします。

java Sample 2> sample_err.out
[INFO] 標準出力:開始します。
[INFO] 標準出力:終了します。

sample_err.outを開くと標準出力の内容が出力されています。

[ERROR] 標準エラー出力:エラーが発生しました。
java.lang.ArithmeticException: / by zero
        at Sample.divideOpration(Sample.java:19)
        at Sample.main(Sample.java:10)

実行4―標準出力と標準エラー出力を両方同じファイルに吐き出す。

今度は標準出力と標準エラー出力を両方同じファイルにしてみます。 その場合は、出力ファイルのパスの後に「2>&1」と記述します。 2番の標準エラー出力を1番の標準出力に回すという指定になります。

java Sample > sample.out 2>&1

sample.outを開くと標準出力と標準エラー出力の両方が出力されています。

[INFO] 標準出力:開始します。
[ERROR] 標準エラー出力:エラーが発生しました。
java.lang.ArithmeticException: / by zero
        at Sample.divideOpration(Sample.java:19)
        at Sample.main(Sample.java:10)
[INFO] 標準出力:終了します。

実行5―INFOとERROR別々のファイルに出力する。

INFOとERROR別々のファイルに出力するには、以下のようにします。

java Sample 2> sample_err.out 1> sample_info.out

それぞれ別々のファイルに吐かれましたね。

printStackTraceメソッドの使い方のまとめ

スタックトレースは、例外の発生元とそこまでの経路の情報を詳細に示すもので、デバッグ時に大変役立つ情報となります。

などの情報を発生元から呼出元まで積上げ式のスタックトレースをprintStackTraceメソッドで出力できます。

また、リダイレクトを使用したログ出力を行いたい場合、printStackTraceメソッドを使用すると標準出力と切り分けられて、 INFOとERROR両方出すとかERRORのみ出すとか、即席でログを切り替えられます。

ちょっとしたアプリケーションの場合、わざわざ外部のログ出力ライブラリを使わなくても簡単にログ出力が行えて便利ですね。

もっと知識を広げるための参考

戻る

スポンサーリンク

サイト内のページ

言語
C・C++ /HTML /Java /JavaScript /PHP /シェルスクリプト

開発環境
Ant /Bcc /Eclipse /gcc /gdb /g++ /JDK /JUnit /ZAP

技術・仕様
Ajax /CORBA /Java EE(旧称J2EE) /JNI

ライブラリ/Framework/CMS
jQuery /Lucene /MyBatis /RESTEasy /Spring /Struts /Seasar2 /WordPress

ITインフラ OSとミドルウェア
Linux /Windows /シェル
Apache/Tomcat /MySQL /Redis /Solr /vsftpd

ITインフラ PC 製品
ZOTAC

ITインフラ サーバー
Web公開サーバー構築

ITインフラ ネットワーク
プログラミング /機器 /構築

ITインフラ セキュリティ
公開サーバーのセキュリティ

SI
ホームページの作り方 /小さな会社のISMS

その他
IT用語 /ITスキル体系 /トレンド履歴

スポンサーリンク