ホームページ  >  記事  >  バックエンド開発  >  C# スタックオーバーフロー例外

C# スタックオーバーフロー例外

王林
王林オリジナル
2024-09-03 15:21:20838ブラウズ

次の記事では、C# StackOverflowException の概要を説明します。 StackOverflowException は、OpCodes.LocalLoc 命令と呼ばれる Microsoft Intermediate Language (MSIL) 命令によってスローされます。 StackOverflowException クラスは、StackOverflowException()、StackOverflowException(文字列メッセージ)、StackOverflowException(文字列メッセージ、例外 innerException) などを含むいくつかのメソッドを提供します。

構文:

[Serializable]
public sealed class StackOverflowException : SystemException

働いています

  • 複数のメソッドが入れ子で呼び出され、制御されない再帰が発生し、メモリ内に無限のスタックが生成される状況が発生すると、プログラムで StackOverflowException が発生します。これにより、最終的にはエラー メッセージが表示されずにプログラムが終了します。
  • プログラムが過剰なメソッド呼び出しにより利用可能なスタック領域を使い果たし、追加のスタック メモリを割り当てることができない場合に発生します。
  • StackOverflowException クラスには、StackOverflowException()、StackOverflowException(文字列メッセージ)、StackOverflowException(文字列メッセージ、例外内部例外) などのメソッドがいくつかあります。

C# StackOverflowException の例

以下に挙げる例を示します:

例 #1

実行時に無限再帰が発生した場合のスタック オーバーフロー例外を示す C# プログラム。

コード:

using System;
//a class called program is defined
public class program
{
// a method called rec is defined which takes a value as parameter and increases its value by one
static void Rec(int vals)
{
// since we have written a recursive loop and 0 is passed as a parameter, it ends in an infinite loop causing exception
Console.WriteLine(vals);
Rec(++vals);
}
//main method is called
public static void Main()
{
//The rec method is called to start the infinite recursion
Rec(0);
}
}

出力:

C# スタックオーバーフロー例外

例 #2

コードの try ブロックと catch ブロックを使用して例外をキャッチした後でも、実行時に無限再帰が発生した場合に StackOverflowException が発生することを示す C# プログラム。

コード:

using System;
//a class called check is defined
public class check
{
// a method called ex is defined which takes a value as parameter and increases its value by one
static void ex(int equals)
{
Console.WriteLine(equals);
ex(++equals);
}
//main method is called within which try and block methods are defined to catch the exception
public static void Main()
{
try
{
//The ex method is called by passing zero as a parameter to start the infinite recursion
ex(0);
}
catch (StackOverflowException ep)
{
Console.WriteLine(ep.Message);
}
}
}

出力:

C# スタックオーバーフロー例外

再帰の無限ループは、try ブロック内の ex メソッドにパラメーターとして 0 を渡すことで始まります。例外をキャッチするために catch ブロックを作成しましたが、この例外はキャッチされる catch ブロックを超えているため、この例外をキャッチできません。

C# で StackOverflowException を回避する手順

  • スタック オーバーフローは、メモリ内のスタックがいっぱいになると発生します。この問題は、スタックの深さを設定することで解決でき、デバッガーはこの情報を提供できます。
  • スタックの深さの値を設定できるようになったので、それをできるだけ小さい値に設定し、出力を観察する必要があります。出力がオーバーフローしていない場合は、より大きな値に変更できます。また、スタック オーバーフローが発生した場合に備えて、スタックの深さに設定する適切な値をデコードできます。 したがって、StackOverflowException をキャッチできる例外を作成するには、デバッガーを使用してスタックの深さを知ることが必須です。
  • 再帰を引き起こすコードが StackOverflowException の原因です。

以上がC# スタックオーバーフロー例外の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。