2015-04-27 259 views
-5
public class ClassA { 
     public void count(int i) 
     { 
      count(++i); //throws StackOverFlowError 
     } 
     public static void main(String[] args) { 
      ClassA a = new ClassA(); 
      a.count(3); 
     } 
    } 

當我調試代碼時,我可以看到它在count方法內的調用count方法,但是在pre-increment之後,爲什麼在不退出方法的情況下繼續遞增i變量?爲什麼會拋出StackOverflowError?

+4

您再次使用遞增的值調用該方法。這個數字無限。 – dhke

+0

放置一個條件來停止遞歸循環。 – Shriram

+2

您正在使用遞歸調用您的方法而沒有任何中斷條件。 – Abubakkar

回答

1

您沒有遞歸函數的終止條件,count方法被一次又一次地調用,您將得到堆棧溢出錯誤。

檢查以下鏈接瞭解更多信息Stack overflow link

2

它是一個遞歸調用(調用相同的方法本身)。基本上遞歸調用必須有一些在這裏丟失的退出標準。

由於沒有退出條件,該方法被一次又一次地調用,每次調用時它都會將一幀插入堆棧內存。最終堆棧內存越來越多,因此錯誤

0

正如您在問題描述中所述,您正在遞歸調用count(int)方法。如果您預先增量或後增量i,則沒有區別。您需要編寫一些退出條件才能退出此遞歸調用。

0

count(++i)的遞歸調用留下未被回收的調用堆棧幀。在具有適當尾部調用的其他語言中,當進行遞歸調用時,堆棧幀將被重用。請注意,在這種情況下,呼叫不會終止。

1

每一個方法調用都有自己的堆棧幀這使寄存器的內容並傳遞給方法的對象參數。所有這些都擁有內存空間。當一個調用遞歸時沒有任何退出條件。對於每個調用堆棧幀,都會生成寄存器內容並開始消耗導致StackOverflow異常的內存。

相關問題