3

プログラム内の単一のメソッドは、スタック上のどこにあるかを「認識」していません。それが知っているのは、それ自身の小さな仕事だけであり、それを実行して戻ってきます。では、例外がスローされてスタック トレースが出力されると、これはどこから来るのでしょうか?

プログラムの状態を監視している JVM 内のすべてのアプリケーションと並行して実行されている別のスレッドが暗黙的に存在しますか? それとも、JVM 自体がこの情報を保持していて、例外がスローされたときに例外が何らかの方法でそのデータをプルするのでしょうか?

これらのいずれかに該当する場合、何らかの呼び出しを使用して、例外をスローすることなく(モニター スレッドまたは JVM のいずれかから) スタック トレースを取得できますか?

4

4 に答える 4

5

すべてのスレッドには独自のstack. メソッド呼び出しごとに、スタック フレームが作成されます。メソッドのコードで何か問題が発生した場合、それは呼び出し元のメソッドに伝播されます。このようにして、JVM はエラーを生成したメソッドと呼び出し階層を追跡できます。

スタックトレースをちゃんと観察すると、上にエラーが発生したメソッド、下に階層が表示されます。

それがどのように機能するかを理解するために、スタンフォード大学の教授によるyoutubeでの素晴らしい講義があります。私はそれを見ることをお勧めします。

注: これは理論です。API の仕組みを知りたい場合は、@Peter Lawrey の回答が役立つ場合があります。

于 2012-10-12T18:41:34.060 に答える
4

これは、コードを実行している Thread クラスから取得されます。

Thread.dumpStack();

それを見るには、次のことができます:

    StackTraceElement[] trace = Thread.currentThread().getStackTrace();
    for (int i=0; i < trace.length; i++)
        System.out.println("\tat " + trace[i]);
于 2012-10-12T18:42:10.187 に答える
3

を使用して、メソッドが属するスレッドを知ることができますThread.currentThread。JVM にはすべてのスレッドのスタックがあるため、このスレッドを使用して StackTrace を取得できます。また、mainプログラムはmainスレッドで実行されます。

于 2012-10-12T18:42:29.453 に答える
3

Throwable を作成すると (スローしたときではなく)、スタック トレースは、Throwable に関連付けられた低レベル/非表示の方法であることが記録されます。初めて getStackTrace() を呼び出すとStackTraceElement[]、低レベルの情報からオブジェクトが作成されます。スタック トレースは頻繁に使用されないため、これは怠惰ではありません。

于 2012-10-12T18:49:50.357 に答える