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

我该如何解决这个问题?

在你的代码中,如果c == 0c <= 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 意味着你的调用堆栈太深了 - 太多嵌套函数在没有完成任何一个的情况下调用 - 递归往往会这样做。

最新更新