1

我遇到以下错误:

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

我怎样才能解决这个问题?

4

3 回答 3

4

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

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

因此,例如,如果您第一次使用 调用此方法c = 0,堆栈就是这样增长的:

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

您继续0作为参数传递,这不满足您的任何基本情况。

至于如何解决这个问题,我们真的没有足够的上下文来找出应该用什么来代替return draw(c);. 但肯定不应该存在。也许return draw(++c);??但我们只能猜测。

也可以看看:

于 2013-09-24T19:24:55.477 回答
1

您不断地调用该draw()方法。所以你调用draw()方法,然后它调用draw()方法,然后它调用draw()方法,然后它调用draw()方法,等等,直到你没有更多的内存。

最后检查你的return陈述。在这种情况下你想返回什么?现在它只是不断地draw()再次调用,这可能不是你想要的。

于 2013-09-24T19:24:45.810 回答
0

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

于 2013-09-24T19:23:53.693 回答