我遇到以下错误:
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);
}
我该如何解决这个问题?
在你的代码中,如果c == 0
或c <= AccBalance
,你继续递归具有相同值c
的方法。因此,它将进入无限递归,从而填满堆栈。
对于每个方法调用,将从堆栈中分配一个堆栈帧。因此,您的代码最终将分配完整的堆栈内存。
因此,例如,如果您第一次使用 c = 0
调用此方法,则堆栈的增长方式如下:
draw(0)
draw(0)
draw(0)
draw(0)
.. so on
您不断传递0
作为参数,这不能满足任何基本情况。
至于如何解决这个问题,我们真的没有足够的上下文来找出应该用什么来代替return draw(c);
。但当然不应该存在。也许return draw(++c);
??但我们只能猜测。
另请参阅:
- 递归:幕后花絮
您不断调用 draw()
方法。所以你调用draw()
方法,然后它调用draw()
方法,然后调用draw()
方法,然后调用draw()
方法,等等,直到你没有更多的内存了。
检查最后的return
声明。在这种情况下,您想返回什么?现在它只是继续再次调用draw()
,这可能不是你想要的。
你有无限递归。 StackOverflowError 意味着你的调用堆栈太深了 - 太多嵌套函数在没有完成任何一个的情况下调用 - 递归往往会这样做。