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

我遇到以下错误:

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  AccBalance) { AccBalance=-c; return AccBalance; } return draw(c); } 

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

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

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

因此,例如,如果您第一次使用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意味着你的调用堆栈太深了 – 调用太多嵌套函数而没有完成任何调用 – 递归往往会这样做。