public class TestClass {
TestClass classIn = new TestClass();
public static void main(String[] args) {
TestClass classIn = new TestClass();
}
}
有誰能告訴我爲什麼這會導致堆棧溢出?遞歸調用導致堆棧溢出異常
public class TestClass {
TestClass classIn = new TestClass();
public static void main(String[] args) {
TestClass classIn = new TestClass();
}
}
有誰能告訴我爲什麼這會導致堆棧溢出?遞歸調用導致堆棧溢出異常
您的classIn
實例變量在每次創建TestClass
的實例時被初始化。因此,每次創建TestClass
的實例時,都立即創建另一個實例,這會導致無限遞歸。
第一個實例在main方法創建:
TestClass classIn = new TestClass();
執行的TestClass
構造之前,實例變量(classIn
你的情況)進行初始化,所以創建另一個實例,它觸發創建另一個實例,等等......(直到堆棧溢出)。將
的錯誤,因爲每當你要創建的TestClass
一個實例,它再次嘗試在該行創建自身實例 -
TestClass classIn = new TestClass();
而這個遞歸繼續進行,直到堆棧溢出。刪除這條線,它應該沒問題。
正如人們提到的那樣,您處於無限遞歸狀態,計算機只有在堆棧溢出之前才能做到這一點。處理遞歸時一個非常重要的規則是:始終,總是有一個基礎類!
階乘遞歸例子想:
int factorial(int n)
{
if(n = 0)
return 1;
else
return n * factorial(n-1);
}
注意的基本情況,你的人,可以手工計算。這種情況是防止溢出的情況,因爲沒有你的代碼會保持循環。假設我沒有這個基本情況下有3個。所以你會得到3 * 2 * 1 * 0 * -1 * -2 ....
只是爲什麼它*不*會導致SO?該遞歸永遠不會結束,每次調用都需要一些堆棧空間。 – kiheru
使用逐行調試器。你會很快看到效果。 – Bathsheba
我認爲這個問題是由於完全不瞭解堆棧溢出實際上是什麼造成的。 – AJFarmar