Sil*_*ior 16 java stack-overflow exception java-ee
如何StackOverflowError在Java中处理?
And*_*ock 17
你可能会进行一些无限递归.
即一种反复调用自己的方法
public void sillyMethod()
{
sillyMethod();
}
Run Code Online (Sandbox Code Playgroud)
处理此问题的方法是修复代码,以便递归终止而不是永远继续.
Hux*_*uxi 16
我不确定你对"手柄"的意思.
你当然可以发现这个错误:
public class Example {
public static void endless() {
endless();
}
public static void main(String args[]) {
try {
endless();
} catch(StackOverflowError t) {
// more general: catch(Error t)
// anything: catch(Throwable t)
System.out.println("Caught "+t);
t.printStackTrace();
}
System.out.println("After the error...");
}
}
Run Code Online (Sandbox Code Playgroud)
但这很可能是一个坏主意,除非你确切知道自己在做什么.
Mic*_*ers 13
看一下Raymond Chen的帖子在调试堆栈溢出时,你想要专注于重复的递归部分.提取物:
如果你去寻找缺陷跟踪数据库,试图查看这是否是一个已知问题,搜索堆栈顶部函数不太可能找到任何有趣的东西.这是因为堆栈溢出往往发生在递归中的随机点; 即使堆栈溢出相同,每个堆栈溢出看起来也与其他堆栈溢出不同.
假设你正在唱" FrèreJacques"这首歌,除了你唱的每首诗比前一首歌高几个音.最终,你将达到你的演唱范围的顶部,并且恰好发生的地方取决于你的声音限制与旋律的对比.在旋律中,前三个音符都是新的"记录高"(即,音符高于到目前为止所唱的任何其他音符),并且在第三个音符的三个音符中出现新的唱片高音,并且最终记录在第五项措施的第二个注释中很高.
如果旋律表示程序的堆栈使用情况,则程序执行中的这五个位置中的任何一个都可能发生堆栈溢出.换句话说,相同的潜在失控递归(音乐上由旋律的更高版本表示)可以以五种不同的方式表现出来.这个类比中的"递归"相当快,在循环重复之前只有8个小节.在现实生活中,循环可能会很长,导致堆栈溢出可能出现的数十个潜在点.
如果您遇到堆栈溢出,那么,您想要忽略堆栈的顶部,因为那只是关注超出您的声音范围的特定音符.你真的想找到整个旋律,因为这是所有堆栈溢出的共同点,具有相同的根本原因.
您可能希望查看JVM是否支持"-Xss"选项.如果是这样,您可能想尝试将其设置为512k(在32位Windows和Unix下默认为256k)并查看是否有任何效果(除了让您在StackOverflowException之前保持更长时间).请注意,这是一个每线程设置,所以如果你有很多线程在运行,你也可能想要提高你的堆设置.
| 归档时间: |
|
| 查看次数: |
82042 次 |
| 最近记录: |