StackOverflowError在Java中意味着什么?它的修复是什么?

时间:2013-09-24 19:21:39

标签: java stack-overflow

我遇到以下错误:

Exception in thread "main" java.lang.StackOverflowError
    at Account.draw(Account.java:47)

这是代码的相关部分:

public double draw(double c) {
    if (c > 0) {
        return c;
    } else if (c < 0 && c > AccBalance) {
        AccBalance=-c;
        return AccBalance;
    }

    return draw(c);
}

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

在您的代码中,如果c == 0c <= AccBalance,您继续使用相同的值c递归该方法。因此,它将进入无限递归,从而填满堆栈。

对于每个方法调用,从堆栈分配堆栈帧。因此,您的代码最终会分配完整的堆栈内存。

因此,例如,如果您第一次使用c = 0调用此方法,则堆栈的增长方式如下:

draw(0)
  draw(0)
    draw(0)
      draw(0)
        .. so on

你继续传递0作为参数,这不符合你的任何基本情况。

至于如何解决这个问题,我们确实没有足够的背景来找出应该代替return draw(c);的内容。但当然不应该存在。也许return draw(++c); ??但我们只能猜测。

另见:

答案 1 :(得分:1)

您不断调用draw()方法。所以你调用draw()方法,然后调用draw()方法,然后调用draw()方法,然后调用draw()方法,等等,直到你有没有更多的记忆了。

最后检查您的return声明。在那种情况下你想要回报什么?现在它只是再次调用draw(),这可能不是你想要的。

答案 2 :(得分:0)

你有一个无限的递归。 StackOverflowError意味着你的调用堆栈太深了 - 调用太多嵌套函数而没有完成任何调用 - 递归往往会这样做。