我遇到以下错误:
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);
}
我该如何解决这个问题?
答案 0 :(得分:4)
在您的代码中,如果c == 0
或c <= 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意味着你的调用堆栈太深了 - 调用太多嵌套函数而没有完成任何调用 - 递归往往会这样做。