カテゴリ: Javaの例外処理 更新日: 2025/12/26

JavaのprintStackTrace()の使い方を完全ガイド!初心者でもわかるスタックトレースの出力方法

356
Java のスタックトレースを出力する「printStackTrace()」の基本

先生と生徒の会話形式で理解しよう

生徒

「Javaでエラーが起きたとき、プログラムのどこで問題が起きたのか調べるにはどうすればいいですか?」

先生

「そういうときはprintStackTrace()メソッドを使うと、エラーの発生箇所を詳しく確認できますよ。」

生徒

「それはエラーメッセージと違うんですか?」

先生

「はい。getMessage()がメッセージだけを返すのに対して、printStackTrace()はエラーの経路やメソッドの呼び出し履歴まで含めて表示してくれます。では実際に使い方を見てみましょう!」

1. printStackTrace()とは?

1. printStackTrace()とは?
1. printStackTrace()とは?

printStackTrace()は、JavaのThrowableクラスに用意されているメソッドで、例外が発生した際にスタックトレース(処理の流れ)を標準エラー出力に表示するために使います。

エラーの原因となった場所を正確に突き止めるために欠かせない手段であり、デバッグやログ記録でも非常によく使われる基本テクニックです。

2. printStackTrace()の基本的な使い方

2. printStackTrace()の基本的な使い方
2. printStackTrace()の基本的な使い方

まずはシンプルな例で、printStackTrace()の動作を確認しましょう。


public class StackTraceExample {
    public static void main(String[] args) {
        try {
            String str = null;
            System.out.println(str.length());
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }
}

java.lang.NullPointerException
	at StackTraceExample.main(StackTraceExample.java:5)

このように、例外の種類・メッセージ・エラーが発生した行番号などがすべて表示され、原因の特定がしやすくなります。

3. printStackTrace()とgetMessage()の違い

3. printStackTrace()とgetMessage()の違い
3. printStackTrace()とgetMessage()の違い

Javaの例外処理ではgetMessage()printStackTrace()がよく使われますが、それぞれの違いは次の通りです。

  • getMessage():例外に設定されたメッセージのみ表示(短くて簡潔)
  • printStackTrace():例外の経路すべてを表示(詳細かつ開発者向け)

ユーザーに表示するのはgetMessage()開発者がエラーを追跡するときはprintStackTrace()というように使い分けるのがポイントです。

4. 出力結果から読み取れる情報

4. 出力結果から読み取れる情報
4. 出力結果から読み取れる情報

printStackTrace()が出力する情報には、次のような要素があります。

  • 例外のクラス名(例:java.lang.NullPointerException
  • エラーメッセージ(例:/ by zero)
  • エラーが発生したクラス名・メソッド名・ファイル名・行番号

この情報をもとに、どのメソッドで例外が発生したのかを正確に追うことができます。

5. ネストした呼び出しでも有効

5. ネストした呼び出しでも有効
5. ネストした呼び出しでも有効

呼び出しが複雑になった場合でも、printStackTrace()すべてのメソッドの呼び出し履歴を上から順に表示してくれるので、トラブルシューティングに非常に役立ちます。


public class DeepCall {
    public static void main(String[] args) {
        try {
            methodA();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static void methodA() {
        methodB();
    }

    static void methodB() {
        methodC();
    }

    static void methodC() {
        throw new RuntimeException("テストエラー");
    }
}

java.lang.RuntimeException: テストエラー
	at DeepCall.methodC(DeepCall.java:19)
	at DeepCall.methodB(DeepCall.java:15)
	at DeepCall.methodA(DeepCall.java:11)
	at DeepCall.main(DeepCall.java:5)

このようにprintStackTrace()は、処理の流れ全体を視覚化するのに最適です。

6. ログ出力に組み込むテクニック

6. ログ出力に組み込むテクニック
6. ログ出力に組み込むテクニック

実務では、printStackTrace()の代わりにログライブラリを使って例外を記録するケースが多いです。


import java.util.logging.Logger;

public class LoggerExample {
    private static final Logger logger = Logger.getLogger(LoggerExample.class.getName());

    public static void main(String[] args) {
        try {
            int[] numbers = new int[2];
            System.out.println(numbers[5]);
        } catch (ArrayIndexOutOfBoundsException e) {
            logger.severe("エラー発生: " + e.toString());
        }
    }
}

printStackTrace()は標準出力でしか見られませんが、ログライブラリならファイルに保存したり、通知に使ったりすることもできます。

7. printStackTrace()の注意点とベストプラクティス

7. printStackTrace()の注意点とベストプラクティス
7. printStackTrace()の注意点とベストプラクティス

printStackTrace()は非常に便利ですが、いくつかの注意点があります。

  • 本番環境では標準出力ではなくログ出力を推奨
  • ユーザー向けの画面に出力してはいけない(セキュリティ上のリスク)
  • catchブロックで例外を無視せず、必ず処理か記録をする

つまり、printStackTrace()開発・テスト段階の強力なデバッグツールとして使い、本番環境ではログ管理に切り替えるのがベストです。

Javaの例外処理の一覧へ
新着記事
IAM Identity Centerの許可セットとポリシーの関係を解説
IAM Identity Centerの許可セットとポリシーの関係を初心者向けにわかりやすく解説!
Java の正規表現で「数字」や「英字」だけをチェックする方法
Javaの正規表現で「数字」や「英字」だけをチェックする方法を初心者向けに完全解説
Java で正規表現を使う方法(Pattern クラスと Matcher クラス)
Javaで正規表現を使う方法を完全解説!PatternクラスとMatcherクラスを初心者向けにやさしく説明
FlutterでQRコードの生成・読み取りをする方法
FlutterでQRコードの生成・読み取りを実装する方法!初心者でもできるQRアプリ開発
人気記事
インスタンスタイプの料金比較と最適な選び方(最新2025年版)
AWSのインスタンスタイプの料金比較と最適な選び方【2025年最新版】
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説