3

私の最初の質問は、スタックトレースを実際に印刷するのは誰ですか? それは JVM ですか、それとも他のエンティティですか? スタック トレースが出力されると、舞台裏で何が起きますか? UncaughtExceptionhandler を提供するアプリケーションがある場合、スタックトレースを出力する際の Uncaught 例外ハンドラーの役割を教えてくれる回答を特に探しています。

4

3 に答える 3

3

1.例外が発生すると、JVM にスローされます。

2.次に、JVM が StackTrace を出力します。

3. StackTrace には、メソッド名、クラス名、ファイル名、および行番号が含まれます。

4. fillInStackTrace()メソッドが呼び出され、新しく作成されたスロー可能オブジェクトのスタック トレース データが再初期化されます。API にアクセスしようとしたときに、例外に関する情報をマスクするのに役立ちます。

于 2012-07-16T15:32:57.103 に答える
1

キャッチされない例外について話しているのですか?例外をキャッチした場合は、Throwable.printStackTraceメソッドを使用して自分でスタック トレースを出力できます。スタック トレースを正確に出力する方法を知りたい場合は、ソース コードを参照してください。

キャッチされていない例外の場合、スタック トレースは、例外がスローされたスレッドの「キャッチされていない例外ハンドラー」によって出力されます。スレッドに独自のキャッチされていない例外ハンドラがない場合は、スレッド グループのハンドラが使用され、親スレッド グループまたは「デフォルトのキャッチされていない例外ハンドラ」に委譲されます。親もデフォルト ハンドラーも存在しない場合は、次のようになります。

それ以外の場合、このメソッドは、Throwable引数が のインスタンスであるかどうかを判断しますThreadDeath。その場合、特別なことは何も行われません。それ以外の場合は、スレッドのメソッドから返されたスレッドの名前を含むメッセージと、のgetNameメソッドを使用したスタック バックトレースが標準エラー ストリームに出力されます。ThrowableprintStackTrace

を使用して、独自のキャッチされていない例外ハンドラをインストールできますThread.setUncaughtExceptionHandler。デフォルトのキャッチされていない例外ハンドラーを設定して、キャッチされていない例外をキャッチするには、次を使用します。Thread.setDefaultUncaughtExceptionHandler

于 2012-07-16T15:49:38.600 に答える
0

AThrowableおよび Exception や RuntimeException などのそのすべてのサブクラスはキーワードtry-catchthrowキーワードで必要であり、それらを処理するのは JVM の Java 部分です。

純粋なJavaではない唯一のことは、fillInStackTrace()メソッドがネイティブであることです。つまり、このメソッドは、Java部分の「外側」のJVMによって提供されます。変数に Throwable がある場合は、スタック トレースのすべての部分を調べることができます。

http://www.docjar.com/html/api/java/lang/Throwable.java.html

「昔」の例外は高価なオブジェクトであったことに注意してください(使用するかどうかに関係なく、例外が構築されたときにスタックトレースが計算されたためだと思います)が、これはスタックを遅らせることによってかなり最適化されました実際に必要になるまで生成をトレースします。

于 2012-07-16T15:49:33.220 に答える