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

我正在使用Eclipse来debuggingJava应用程序。 在代码的某处我得到一个exception和堆栈跟踪:

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

整个堆栈。

这只是堆栈跟踪的一部分。 直接在这之前是另一块。 看看这一个的底线,和上一个的顶线。 你会看到他们匹配。 堆栈跟踪以不以“由…引发”开始的部分开始。

“由…引起”exception隐藏了堆栈跟踪的一部分,这些堆栈跟踪的父级中的堆栈跟踪条目是逐字拷贝的。 换句话说,Java并没有将每个原因的整个堆栈显示到main(),它只是显示了你没有看到的东西。 请参阅Throwable.printStackTrace()文档 。

当您创buildThrowable时提供原因填充“引起”。 看看它的构造函数。 当一段代码捕获到一个低级的exception,然后想把它作为一个不同的exception类重新抛出时,就完成了这个任务。

上面的答案是不准确的,每次堆栈显示“由…造成”这个词,就意味着这个exception经过了一个或多个方法,直到被捕获,然后再被抛出。 这可能会发生很多次,堆栈跟踪不是一个循环,它是一个单一的方向,所以不,顶部的东西不涉及底部的东西,最重要的部分是在底部,是exception的根源,所以如果你有:

在类的主要exception:等等等等…代码行…由FileNotFoundException …代码行…引起:MalformedURLException …代码行…引起:NullPointerException

那么你不会在FileNotFoundException上过多地关注,但是你会更关注NullPointerException。 就像说你有一个文件名的属性文件。 如果不小心使用了mykey,find属性“myKey”,那么propertiesResource会返回一个null,然后通过所有的代码行(希望)一直抛出到最后一个catch块所在的应用程序。 。 。 在这个piont中,它将被“包装”而不是一个nullException,而是一个FileNotFoundException。 。 。

在这里输入图像说明

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

我认为这意味着在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"); } } 

正如埃德所说,这是显示整个堆栈,但遗漏了你已经看到的信息。 请参阅Throwable#printStackTrace()

从那里引用:

注意包含字符“…”的行的存在。 这些行表明这个exception的堆栈跟踪的其余部分与由exception(“封闭”exception)引起的exception的堆栈跟踪底部的指定数目的帧匹配。 这种简写可以在常见情况下大大减less输出的长度,在这种情况下,捕获的exception与捕获“使用exception”的方法相同

常常包装一个exception; 造成另一个例外的原因:

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

在这种情况下,显示堆栈跟踪将创build…你看到的11多。

我从来没有见过,但尝试这一点

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