And*_*ock 17

你可能会进行一些无限递归.

即一种反复调用自己的方法

public void sillyMethod()
{
    sillyMethod();
}
Run Code Online (Sandbox Code Playgroud)

处理此问题的方法是修复代码,以便递归终止而不是永远继续.

  • 方法名称为+1.另外:KnightsWhoSayNeet() (4认同)
  • 有时无限递归会很好地伪装自己.在stackoverflow之后查看调试器内的堆栈跟踪. (3认同)

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)

但这很可能是一个坏主意,除非你确切知道自己在做什么.

  • 您的程序中很可能遇到严重问题.评估堆栈跟踪并检查是否发现任何可疑内容.捕获StackOverflowError后可以继续,因为调用堆栈已被抛出的错误清空了......但我只能重复自己:找到导致问题的真正错误! (4认同)
  • Ankur,它的StachOverflowError,而不是StackOverflowException,不同之处在于名称"ERROR"表示它不应该通过try ... catch捕获,但是你应该像我和其他大多数人所建议的那样重写你的代码. (4认同)
  • 处理异常意味着在忽略异常后希望继续进行.由于它是stackOverflowException,我认为没有java所需的堆栈空间可用.那么在这种情况下如何进一步推进? (3认同)
  • @Avrom没有**stach**溢出的东西 (3认同)

Mic*_*ers 13

看一下Raymond Chen的帖子在调试堆栈溢出时,你想要专注于重复的递归部分.提取物:

如果你去寻找缺陷跟踪数据库,试图查看这是否是一个已知问题,搜索堆栈顶部函数不太可能找到任何有趣的东西.这是因为堆栈溢出往往发生在递归中的随机点; 即使堆栈溢出相同,每个堆栈溢出看起来也与其他堆栈溢出不同.

假设你正在唱" FrèreJacques"这首歌,除了你唱的每首诗比前一首歌高几个音.最终,你将达到你的演唱范围的顶部,并且恰好发生的地方取决于你的声音限制与旋律的对比.在旋律中,前三个音符都是新的"记录高"(即,音符高于到目前为止所唱的任何其他音符),并且在第三个音符的三个音符中出现新的唱片高音,并且最终记录在第五项措施的第二个注释中很高.

如果旋律表示程序的堆栈使用情况,则程序执行中的这五个位置中的任何一个都可能发生堆栈溢出.换句话说,相同的潜在失控递归(音乐上由旋律的更高版本表示)可以以五种不同的方式表现出来.这个类比中的"递归"相当快,在循环重复之前只有8个小节.在现实生活中,循环可能会很长,导致堆栈溢出可能出现的数十个潜在点.

如果您遇到堆栈溢出,那么,您想要忽略堆栈的顶部,因为那只是关注超出您的声音范围的特定音符.你真的想找到整个旋律,因为这是所有堆栈溢出的共同点,具有相同的根本原因.


TMN*_*TMN 7

您可能希望查看JVM是否支持"-Xss"选项.如果是这样,您可能想尝试将其设置为512k(在32位Windows和Unix下默认为256k)并查看是否有任何效果(除了让您在StackOverflowException之前保持更长时间).请注意,这是一个每线程设置,所以如果你有很多线程在运行,你也可能想要提高你的堆设置.