2

重複の可能性:
Java で現在のスタック トレースを取得する

メッセージをファイルに保存する方法があります。このメソッドは、メイン プログラムのさまざまな部分から呼び出されます。Exceptionトリガーされていなくても、オンデマンドでスタック トレースを生成する方法はありますか?

例えば、こんなものを期待していたのに…

void saveMsg(String Msg)
{
  if (a==b) Print Out Where This Method Was Called From [ like stackTrace in exception ]
  else saveMsgToFile(filePath,Msg);
}

Java が でスタック トレースを実行できることは知っていますが、スタック トレースが発生してExceptionいないときにスタック トレースを生成するにはどうすればよいExceptionですか?

4

3 に答える 3

2

を実行するだけThread.dumpStack()で、スタック トレースがコンソールに出力されます。例外を作成してキャッチする必要はありません。

于 2012-11-01T01:51:40.450 に答える
2

独自に生成Exceptionして結果を取得できます...

try {
    throw new Exception("Tracing only");
}
catch (Exception e){
    e.printStackTrace();
}

このコードは、スタック トレースを出力する任意の場所に配置します。

このようにする利点はe.printStackTrace();、コンソールに出力したい場合に、メソッドが出力を適切に処理することです。をトリガーするExceptionことで、原因のテキスト文字列 (この例では"Tracing only") を指定することもできるため、"Tracing the saveMsg method".

または、これを呼び出してスタック トレース自体を取得することもできます...

Thread.currentThread().getStackTrace();

ただし、これにより、StackTraceElementループして出力する必要がある s の配列が残ります。Exception私の意見では、最初のオプションのように、独自の を生成してキャッチする方が簡単でクリーンです。

于 2012-11-01T01:42:58.117 に答える
1

ただ、残念ながら

    Thread.currentThread().getStackTrace();

あなたの仕事に役立ちます。問題は、前述のすべてのアプローチがメソッド (saveMsg) をスタックの一番上に出力することですが、これは一般的に望ましくありません。代わりに、getStackTrace() メソッドから返された最初の要素をスキップする必要があります。

于 2012-11-01T02:05:54.457 に答える