2015-07-21 121 views
3
public class TestClass { 

    TestClass classIn = new TestClass(); 
    public static void main(String[] args) { 
     TestClass classIn = new TestClass(); 
    } 
} 

有誰能告訴我爲什麼這會導致堆棧溢出?遞歸調用導致堆棧溢出異常

+1

只是爲什麼它*不*會導致SO?該遞歸永遠不會結束,每次調用都需要一些堆棧空間。 – kiheru

+1

使用逐行調試器。你會很快看到效果。 – Bathsheba

+0

我認爲這個問題是由於完全不瞭解堆棧溢出實際上是什麼造成的。 – AJFarmar

回答

1

您的classIn實例變量在每次創建TestClass的實例時被初始化。因此,每次創建TestClass的實例時,都立即創建另一個實例,這會導致無限遞歸。

第一個實例在main方法創建:

TestClass classIn = new TestClass(); 

執行的TestClass構造之前,實例變量(classIn你的情況)進行初始化,所以創建另一個實例,它觸發創建另一個實例,等等......(直到堆棧溢出)。將

2

的錯誤,因爲每當你要創建的TestClass一個實例,它再次嘗試在該行創建自身實例 -

TestClass classIn = new TestClass(); 

而這個遞歸繼續進行,直到堆棧溢出。刪除這條線,它應該沒問題。

1

正如人們提到的那樣,您處於無限遞歸狀態,計算機只有在堆棧溢出之前才能做到這一點。處理遞歸時一個非常重要的規則是:始終,總是有一個基礎類!

階乘遞歸例子想:

int factorial(int n) 
{ 
if(n = 0) 
    return 1; 
else 
    return n * factorial(n-1); 
} 

注意的基本情況,你的人,可以手工計算。這種情況是防止溢出的情況,因爲沒有你的代碼會保持循環。假設我沒有這個基本情況下有3個。所以你會得到3 * 2 * 1 * 0 * -1 * -2 ....