7

私は次のコードを持っています:

import org.apache.commons.lang.exception.ExceptionUtils;
public void myMethod() {
    try {
        // do something
    } catch (Exception e) {
        System.out.println(ExceptionUtils.getStackTrace(e)); // prints "java.lang.NullPointerException"
        System.out.println(ExceptionUtils.getFullStackTrace(e)); // prints "java.lang.NullPointerException"
        e.printStackTrace(); // prints "java.lang.NullPointerException"
    }
}

私が見たい出力は、行番号と失敗したクラスの階層を含む完全なスタックトレースです。例えば、

Exception in thread "main" java.lang.NullPointerException
        at org.Test.myMethod(Test.java:674)
        at org.TestRunner.anotherMethod(TestRunner.java:505)
        at java.util.ArrayList(ArrayList.java:405)

このコードは、log4jもあるより大きなアプリ内で実行されていますが、Java開発者に電子メールとして送信できるように、例外を文字列に取り込むことができることを望んでいます。

スタックトレース全体を文字列にキャプチャする方法について誰かがアイデアを持っていますか?このアプリはJava4で実行されるため、Thread.currentThread()。getStackTrace()を使用できません。上記のコードが完全なスタックトレースを出力するのを妨げているのは何ですか?

4

8 に答える 8

17

これは、サーバーモード(java -server)で実行すると、これをスキップするためにjavaがコードの最適化を行うためです。Java引数での使用-XX:-OmitStackTraceInFastThrowの詳細については、以下のリンクを参照してください。

http://jawspeak.com/2010/05/26/hotspot-caused-exceptions-to-lose-their-stack-traces-in-production-and-the-fix/

于 2013-03-08T13:50:45.240 に答える
13

例外を繰り返しスローすると、JVMはスタックトレースへの入力を停止します。理由はわかりませんが、JVMの負荷を軽減するためかもしれません。詳細を確認するには、以前のスタックトレースを確認する必要があります。

for (int n = 0; ; n++) {
    try {
        Integer i = null;
        i.hashCode();
    } catch (Exception e) {
        if (e.getStackTrace().length == 0) {
            System.out.println("No more stack trace after " + n + " thrown.");
            break;
        }
    }

プリント

No more stack trace after 20707 thrown.
于 2012-09-11T14:55:20.860 に答える
3

完全なスタック トレースを文字列にキャプチャする方法について、誰かアイデアはありますか?

以下の方法 (StringWriter.toString()) を使用して、スタック トレースを文字列に転送できます。

 StringWriter writer = new StringWriter();
 e.printStackTrace( new PrintWriter(writer,true ));
 System. out.println("exeption stack is :\n"+writer.toString());
于 2014-08-07T05:14:50.490 に答える
2

例外がキャッチされ、catch ブロックの前のどこかでスローされる可能性があります。たぶん、ロジックを実行するために呼び出している別のクラスで。

Exception作成されたような
new Exception(new Throwable("java.lang.NullPointerException"));
ものは、あなたが見ているようなものを印刷します。

于 2012-09-11T14:55:58.650 に答える
1

コンソール出力用のアペンダーがない可能性があります。1つ追加することを検討してください。そうでない場合は、LOGGER.error(ex); としてログに記録します。log4j または SLF4J を使用

于 2012-09-11T14:46:11.050 に答える
1

e.printStackTrace()string だけを出力する理由は 2 つしか考えられません"java.lang.NullPointerException"

  • setStackTrace(new StackTraceElement[0])例外で何かが呼び出された可能性があります。
  • printStackTrace()例外オブジェクトは、または他のメソッドをオーバーライドして誤解を招く情報を返すトリッキーなクラスのインスタンスである可能性があります。
于 2012-09-11T15:06:03.180 に答える