2013-09-24 145 views
1

我遇到了以下錯誤: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); 
} 

我怎樣才能解決這個問題?

+1

這意味着你已經遞歸太深,有[堆棧中的運行空間(http://en.wikipedia.org /維基/ STACK_OVERFLOW)。 – thegrinner

+0

好,那我該如何解決? –

+0

這意味着你的'if'或'else'塊都不會被執行,並且'draw(c)'被遞歸地,無限地調用。 – GriffeyDog

回答

0

你有一個無限遞歸。 StackOverflowError意味着你的調用堆棧太深 - 太多的嵌套函數沒有完成任何調用 - 這種遞歸往往會這樣做。

1

您不斷地撥打draw()方法。因此,您調用draw()方法,然後調用draw()方法,然後調用draw()方法,然後調用draw()方法等,直到您沒有剩餘內存爲止。

檢查您的return聲明在最後。在這種情況下你想要返回什麼?現在它只是一直呼籲draw(),這可能不是你想要的。

4

在您的代碼中,如果c == 0c <= AccBalance,您繼續遞歸具有相同值c的方法。所以,它會進入無限遞歸,從而填滿堆棧。

對於每個方法調用,都從堆棧中分配一個堆棧幀。因此,您的代碼將最終分配完整的堆棧內存。

所以,例如,如果你調用該方法首次與c = 0,這是堆棧是如何增長的:

draw(0) 
    draw(0) 
    draw(0) 
     draw(0) 
     .. so on 

您繼續傳遞0作爲參數,它不能滿足您的任何基地案例。

至於如何解決這個問題,我們確實沒有足夠的上下文來找出應該去取代return draw(c);。但肯定不應該在那裏。也許return draw(++c); ??但我們只能猜測。

參見:

+0

)如何阻止這種無限遞歸? –

+0

@AbdulMoeed。閱讀我的最後兩行 –

+0

nope。它仍然是一樣的 –