カテゴリ: Javaの例外処理 更新日: 2026/05/21

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()というように使い分けるのがポイントです。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

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(ジャバ)のprintStackTrace(プリントスタックトレース)メソッドとは、具体的にどのような機能を持つメソッドなのですか?初心者にもわかりやすく教えてください。

JavaのprintStackTrace(プリントスタックトレース)メソッドとは、プログラムの実行中にエラー(例外:エクセプション)が発生した際、そのエラーが「どのクラス」の「どのメソッド」の「何行目」で発生したのかという経過・履歴を、標準エラー出力として画面に表示するための機能です。Throwable(スローアブル)クラスで定義されており、Javaのほぼすべてのエラーオブジェクトで使用可能です。デバッグ作業において、プログラムがどのような経路を辿って停止したのかを視覚的に把握できるため、原因特定には欠かせない基本中の基本となるメソッドです。
Javaの例外処理の一覧へ
新着記事
Flutter
Flutterでのリポジトリパターンの実装例
Flutterでリポジトリパターンを実装する方法を完全解説!初心者向けアーキテクチャ設計入門
Java
Java の Objects クラスを使って null チェックを簡単にする方法
JavaのObjectsクラスの使い方を完全ガイド!nullチェックを簡単・安全に行う方法
Java
Java の UUID クラスを使って一意の識別子を作成する方法
JavaのUUIDクラスの使い方を完全ガイド!初心者でもわかる一意な識別子の作成方法
Java
Java の古い日付クラス(Date, Calendar)と新しい日付 API の違い
JavaのDateとCalendarと新しい日付APIの違いとは?初心者向け完全ガイド
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク