2013-04-17 61 views
-3

我在看C#教程並遇到了StackOverflowException。在C#,C++和Java中導致堆棧溢出的最簡單方法

解說員使用下面的代碼片段,

public class Employee 
{ 
    private string _name; 

    public string Name 
    { 
     get{ return Name; } 
    } 
} 

我在JavaScript中尋找這種類型的用C簡單的代碼++和Java,更特別的一些例子給了這樣的異常整齊的例子會導致堆棧溢出。

+14

遞歸:請參閱遞歸。 –

+2

只要在任何語言中編寫沒有突破條件的遞歸函數,就會給出SO異常。 –

+0

*「我正在尋找一些例子..」*這是搜索引擎的用途。這是一個問答網站。 –

回答

5

在Java:

public class Test { 
    public static void main(String[] args) { 
     main(args); 
    } 
} 

一般情況下,不終止或有太多的重複會導致此問題的任何遞歸函數。

+4

不妨將代碼縮小50%,直接從main調用main(args)。 –

+0

是的。我認爲這種方式更清晰,但我想不是。我會更新這個例子。謝謝。 – NilsH

+0

我不知道爲什麼我會陷入低谷,我一直在尋找像這樣的棘手的例子,現在我看起來像一個愚蠢的: 我應該讓我的問題更清楚:| –

13

此解釋是StackOverflowException對於java,C,C++語言的基本原因。

由於遞歸方法調用,Stackoverflow異常在任何語言中都是通用引發的。

假設你有一個方法正在調用自己或任何其他方法的無限遞歸循環,那麼它會導致Stacoverflowexception。這背後的原因是方法調用堆棧被填充,它不會適應任何其他方法調用。

方法調用堆棧看起來像這張圖片。

enter image description here

說明 - 假設主要方法有五種報表和第三種方法具有了methodA,然後主要方法的執行被暫停在聲明3和MethosA將被加載到調用堆棧的調用。然後方法A調用methodB。所以methodB也被加載到堆棧中。

所以通過這種方式,無限遞歸調用使得調用堆棧得到填充。所以它不能提供更多的方法。所以它拋出StackOverflowException。

+2

請注意,某些語言(特別是Scala)支持[tail-call optimization](http://stackoverflow.com/questions/310974/what-is-tail-call-optimization),因此不會受到最簡單的堆棧溢出案件(以及其他)。 –

+1

+1好的答案。請注意,優化[tail遞歸](http://en.wikipedia.org/wiki/Tail-recursive)的語言可能不會在問題中拋出函數。 –

+0

@ bmorris591我糾正了我自己。感謝您的幫助。 +1爲您提供幫助。 –

2

對於您的代碼段,這是由於遞歸方法調用:

public string Name 
{ 
    get{ return Name; } 
} 

您遞歸調用Name方法/屬性。該堆棧填滿(與父母Name方法),直到它溢出並StackOverflowException被引發。

2
public string Name 
{ 
    get{ return Name; } 
} 

此屬性與return Name;利用自稱。這會導致無限遞歸。這就是爲什麼當你使用這個屬性時,你會得到StackOverflowException。我相信這個屬性的正確用法應該;

public string Name 
{ 
    get{ return _name; } 
} 

StackOverflowException通常在非常深的或無限遞歸的情況下拋出執行堆棧溢出錯誤, 。

從.NET Framework 2.0版開始,StackOverflowException 對象不能被try-catch塊捕獲,並且相應的 進程默認終止。因此,建議用戶 編寫代碼來檢測和防止堆棧溢出。例如, 如果您的應用程序依賴於遞歸,請使用計數器或狀態 條件來終止遞歸循環