如何在eclipse上显示完整的堆栈跟踪?

时间:2011-09-29 13:09:07

标签: java eclipse

我正在使用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

7 个答案:

答案 0 :(得分:28)

拥有整个堆栈。

这只是堆栈跟踪的一部分。直到此之前是另一件作品。看看这一行的底线和前一行的顶行。你会看到他们匹配。堆栈跟踪以一个不以“由...引起”的部分开始。

“由...引起”异常隐藏了堆栈跟踪的部分,这些部分是其父级中的堆栈跟踪条目的逐字副本。换句话说,Java并没有为每个原因显示整个堆栈的main() - 它只显示你还没有看到的东西。请参阅Throwable.printStackTrace() documentation

创建Throwable时提供原因时会填充“由...引起”。看看它的构造函数。当一段代码捕获一个低级异常,然后想要将它重新抛出为另一个异常类时,就可以完成此操作。

答案 1 :(得分:9)

上面的答案是不准确的,每次堆栈显示“由...引起”这意味着异常经过一个或多个方法,直到被捕获,然后再次抛出。这可能会发生很多次,堆栈跟踪不是循环,它是单个方向,所以不,顶部的东西与底部的东西无关,最重要的部分是底部的那个,是异常的根,所以如果你有:

主要课程中的例外:等等等等 ......代码行...... 由FileNotFoundException引起 ......代码行...... 引起:MalformedURLException ......代码行...... 由以下原因引起:NullPointerException

那么你不希望如此关注FileNotFoundException,但是你想要更多地关注NullPointerException。比如说你有一个带有文件名的属性文件。如果意外地使用mykey,找到属性“myKey”,那么propertiesResource将返回一个null,然后将所有代码行(希望)一直抛到最后一个catch块所在的应用程序。 。 。在这个piont中,它将被“包装”而不是作为nullException,而是作为FileNotFoundException。 。 。

答案 2 :(得分:5)

enter image description here

我们可能会偏离他面临的实际问题。我有类似的问题,事实证明我有我的限制控制台输出框检查标记。删除它后,我能够看到完整的堆栈跟踪。 脚步: 右键单击控制台|| ctrl +点击如果mac 转到首选项并按照上述说明进行操作

答案 3 :(得分:2)

我认为这意味着在Exception被调用之前,printStackTrace已被捕获并被打包到另一个 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");
    }

}

答案 4 :(得分:1)

正如Ed所说,它显示了整个堆栈,但遗漏了您已经看到的信息。见Throwable#printStackTrace()

从那里引用:

  

注意是否存在包含字符“...”的行。这些   行表示堆栈的其余部分为此跟踪   异常匹配来自底部的指定帧数   由此异常引起的异常的堆栈跟踪   (“附上”例外)。这种速记可以大大减少   包装异常的常见情况下的输出长度   从“致使例外”被捕获的方法抛出

通常会包含异常;创建时以另一个异常为原因:

try {
    // something which causes an Exception
} catch (Exception e) {
    throw new SpecificException("help", e);
}

在这种情况下,显示堆栈跟踪将创建另外11个您看到的内容。

答案 5 :(得分:1)

我从未见过,但试试这个

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());
     }
  }
}

答案 6 :(得分:0)

有一个vmargs选项

 -XX:-OmitStackTraceInFastThrow

在某些情况下可能有所帮助。