[java] どのように日食に完全なスタックトレースを表示するには?


2 Answers

上記の答えは正確ではありません。スタックに「起因する」という単語が表示されるたびに、例外が1つまたは複数のメソッドを経由して捕捉され、再度スローされることを意味します。 これは何度も何度も起こることがあります。スタックトレースはループではなく、単方向ですから、上のものは下のものには関係せず、一番重要な部分は下にあります。例外の根源なので、もしあなたが持っていれば:

クラスmainの例外:blah blah blah ...コード行... FileNotFoundException ...コード行...原因:MalformedURLException ...コード行...原因:NullPointerException

FileNotFoundExceptionにあまり集中したくないのですが、NullPointerExceptionにもっと焦点を当てたいと思うでしょう。 あなたの中にファイル名を持つプロパティファイルがあるとしましょう。 誤ってmykeyを使用した場合、プロパティ "myKey"を見つけると、propertiesResourceはnullを返し、最終的なcatchブロックがあるアプリケーションにすべてのコード行を渡します(うまくいけば)。 。 。 この場合、nullExceptionとしてではなく、FileNotFoundExceptionとして「ラップ」されます。 。 。

Question

Eclipseを使用してJavaアプリケーションをデバッグしています。 コードのどこかで、例外とスタックトレースを取得します。

Caused by: java.io.EOFException: The connection has been reset while reading the header
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.fetchHeader(Message.java:583)
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.readHeaderAndPayload(Message.java:599)
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.read(Message.java:542)
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.recv(Message.java:1029)
    at com.gemstone.gemfire.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:158)
    at com.gemstone.gemfire.cache.client.internal.AbstractOp.attempt(AbstractOp.java:363)
    at com.gemstone.gemfire.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:229)
    at com.gemstone.gemfire.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:321)
    at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:646)
    at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:108)
    ... 11 more

代わりにスタック全体を取得するには... 11 more




私はそれを見たことがないが、これを試してみてください

public void problemFunction(){
  try{
      //your code
  catch(Exception ex){
     ex.printStackTrace();
  }
}

または

public void problemFunction(){
  try{
      //your code
     }
  catch(Exception ex){
     System.out.println(ex);
     StackTraceElement[] arr = ex.getStackTrace();
     for(int i=0; i<arr.length; i++){
       System.out.println(arr[i].toString());
     }
  }
}



printStackTraceが呼び出される前にExceptionがキャッチされて別の11回にパッケージ化されたことを意味すると思います。

次のプログラムの出力を試して理解してください。

public class PrintStackTrace {

    public static void main(String[] args) {
        try {
            level1();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            level2();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    static void level2() throws Exception {
        try {
            level1();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    static void level1() throws Exception {
        try {
            throwingMethod();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    static void throwingMethod() throws Exception {
        throw new Exception("throwingMethod");
    }

}



Related



Tags

java java   eclipse