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 == 0
或c <= AccBalance
,则继续使用相同的c
值c <= 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意味着你的调用堆栈太深了 – 调用太多嵌套函数而没有完成任何调用 – 递归往往会这样做。