我正在使用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
?
答案 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)
我们可能会偏离他面临的实际问题。我有类似的问题,事实证明我有我的限制控制台输出框检查标记。删除它后,我能够看到完整的堆栈跟踪。 脚步: 右键单击控制台|| 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
在某些情况下可能有所帮助。