1。スタックトラックを印刷する方法
Throwable ObjectのPrintStackTrace()= PrintStackTrace(System.err)、PrintStackTrace(PrintStream)、およびPrintStackTrace(PrintWriter)の1つをアクティブに呼び出します。
例外が処理されていない場合、メインメソッドの直後にスローすると、プログラムが終了する前に例外printStackTrace()メソッドが呼び出され、最終的には「Main」 + PrintStackTrace()の例外が呼び出されます。
2。スタックトラック
1。printstacktrace()
まず、この方法が例外クラスから来ていないことを明確にする必要があります。複数のコンストラクターを定義することを除き、すべての方法は親クラスから継承されます。例外に関連する方法は、java.lang.throwableクラスから継承されます。 printStackTrace()もその1つです。
このメソッドは、スロー可能なオブジェクトのスタックトラック情報を標準のエラー出力ストリームに印刷します。出力は次のようになります:
myclass.mash(myclass.java:9)のmyclass.crunch(myclass.java:6)at myclass.main(myclass.java:3)のJava.lang.nullpointerexception
出力の最初の行は、ToString()メソッドの出力です。この方法については後で説明します。
以下の例を見てみましょう。
public class testprintstacktrace {public static void f()throws {throw new Exception( "があります!"); ){try {g();この例の出力は次のとおりです。
java.lang.exception:何かがうまくいかなかった! testprintstacktrace.f(testprintstacktrace.java:3)でtestprintstacktrace.g(testprintstacktrace.java:6)のtestprintstacktrace.main(testprintstack trace.java:10)
この例では、例外がメソッドf()にスローされ、メソッドf()はメソッドg()で呼び出され、例外はメインメソッドでキャッチされ、スタックトラック情報が印刷されます。したがって、出力はfのプロセスを示しています。
2。GetStackTrace()メソッド
この方法は、printStackTrace()メソッドによって印刷された情報へのプログラム的なアクセスを提供します。スタックトラック要素の配列を返します。上記の出力は、各ライン2〜4の出力のコンテンツがスタックトラック要素に対応しています。これらのスタックトラック要素を配列に保存します。各要素は、スタックフレームに対応します。アレイの最初の要素は、スタックの上部要素を保存します。これは上記のfです。最後の要素の一番下の要素が保存されました。
getStackTrace()を使用してこれらのトラックスタック要素にアクセスし、出力を印刷する例を次に示します。
public class testprintstacktrace {public static void f()throws {throw new Exception( "があります!"); ){try {g(); -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- ----------------------------------------------------------------------------------------- - "); for(stacktraceElement elem:e.getStacktrace()){system.out.println(elem);}}}}}このような出力は、基本的には次のようにprintStacktrace()の出力と同じです。
java.lang.exception:何かがうまくいかなかった! testprintstacktrace.f(testprintstacktrace.java:3)でtestprintstacktrace.g(testprintstacktrace.java:6)at testprintstacktrace.main(testprintstack trace.java:10)testprintstacktrace.f(テストリットトレットップトルテストプリント)。 Java:6)testprintstacktrace.main(testprintstacktrace.java:10)
3.fillinstacktraceメソッド
Native FillinStackTrace()メソッドは、現在の呼び出しスタック情報を元の例外オブジェクトに入力することによって作成されるスロー可能なオブジェクトを返します。したがって、返された元の例外は依然として元の例外です。
この方法を呼び出す行は例外になり、元の例外発生ポイントに関する情報が失われます。その効果は、例外をキャッチし、別の例外を再投与することと同等です。 2つの違いは、Fillinstacktrace後の例外がまだ元の例外であることです(スタックトラックがない場合)。 。
パッケージcom.jyz.study.jdk.exception; );プライベートvoid test1()スロー{test2(); static void test2(){test3(); 1と2の例外スタック情報を図に示します。
違いは、これ自体の情報です。
1のスタック情報
スレッド「Main」java.lang.nullpointerexception:strはcom.jyz.study.jdk.exception.fillinstacktrace.fillinstacktrace.java:20)でcom.jyz.study.jdk.exception.fillinstacktraceでnullです。 Main(fillinstacktrace.java:13)
2スタック情報
com.jyz.study.jdk.exception.fillinstacktrace.test1(fillinstacktrace.java:21)のcom.jyz.study.jdk.exceptionのスレッド「main」java.lang.exceptionの例外:13)