-2

C# のチュートリアルを見ていると、StackOverflowException に出会いました。

ナレーターは、以下のコード スニペットを使用して、そのような例外の適切な例を示しました。

public class Employee
{
    private string _name;

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

C ++とJavaのこのタイプの単純なコードの例を探しています。また、Stack Overflowを引き起こす可能性のあるJavaScriptでより特別に説明しています。

4

4 に答える 4

13

この説明は、Java、C、および C++ の StackOverflowException の背後にある基本的な理由です。

スタック オーバーフロー例外は、通常、再帰的なメソッド呼び出しが原因で、どの言語でも発生します。

それ自体を呼び出すメソッド、または無限再帰ループの他のメソッドを呼び出すメソッドがあるとします。StackoverflowException が発生します。この背後にある理由は、メソッド呼び出しスタックがいっぱいになり、他のメソッド呼び出しに対応できなくなるためです。

メソッド呼び出しスタックはこの図のようになります。

ここに画像の説明を入力

説明-- Main メソッドに 5 つのステートメントがあり、3 番目のメソッドに methodA の呼び出しがあるとします。この場合、Main メソッドの実行は statement3 で一時停止され、methodA が呼び出しスタックにロードされます。次に、メソッド A が methodB を呼び出します。したがって、methodB もスタックにロードされます。

したがって、この方法では、無限の再帰呼び出しによって呼び出しスタックがいっぱいになり、その時点でそれ以上メソッドを使用できなくなります。そのため、StackOverflowException がスローされます。

于 2013-04-17T07:02:51.617 に答える
5

Java の場合:

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

一般に、再帰関数が終了しないか、反復回数が多すぎると、この問題が発生します。

于 2013-04-17T07:04:34.053 に答える
2

コード スニペットの場合、これは再帰メソッド呼び出しによるものです。

public string Name
{
   get{ return Name; }
}

Nameメソッド/プロパティを再帰的に呼び出しています。Nameスタックは、オーバーフローして aStackOverflowExceptionがスローされるまで(親メソッドで) いっぱいになります。

于 2013-04-17T07:04:05.087 に答える
2
public string Name
{
   get{ return Name; }
}

このプロパティは with を使用して自分自身を呼び出しますreturn Name;。これにより、無限再帰が発生します。そのため、このプロパティを使用するとStackOverflowExceptionが発生します。このプロパティの正しい使用方法は次のとおりです。

public string Name
{
   get{ return _name; }
}

StackOverflowException は、通常、非常に深い再帰または無限の再帰の場合に、実行スタック オーバーフロー エラーに対してスローされます。

.NET Framework バージョン 2.0 以降では、StackOverflowException オブジェクトを try-catch ブロックでキャッチできず、対応するプロセスが既定で終了します。したがって、スタック オーバーフローを検出して防止するコードを記述することをお勧めします。たとえば、 アプリケーションが再帰に依存している場合は、カウンターまたは状態条件を使用して再帰ループを終了します

于 2013-04-17T07:04:25.847 に答える