Rumah  >  Artikel  >  pembangunan bahagian belakang  >  C# StackOverflowException

C# StackOverflowException

王林
王林asal
2024-09-03 15:21:20844semak imbas

Artikel berikut menyediakan garis besar untuk C# StackOverflowException. StackOverflowException dilemparkan oleh arahan Microsoft Intermediate Language (MSIL) yang dipanggil OpCodes.LocalLoc arahan. Kelas StackOverflowException menyediakan beberapa kaedah, termasuk StackOverflowException(), StackOverflowException(mesej rentetan), StackOverflowException(mesej rentetan, pengecualian innerexception), dan sebagainya.

Sintaks :

[Serializable]
public sealed class StackOverflowException : SystemException

Bekerja

  • Atur cara menghadapi StackOverflowException apabila terdapat situasi di mana berbilang kaedah dipanggil secara bersarang, mengakibatkan rekursi tidak terkawal yang menjana tindanan tanpa had dalam ingatan. Ini akhirnya membawa kepada penamatan program tanpa memaparkan mesej ralat.
  • Ia berlaku apabila program kehabisan ruang tindanan yang tersedia disebabkan oleh kaedah panggilan yang berlebihan dan tidak dapat memperuntukkan memori tindanan tambahan.
  • Terdapat beberapa kaedah kelas StackOverflowException seperti StackOverflowException(), StackOverflowException(mesej rentetan), StackOverflowException(mesej rentetan, pengecualian innerexception), dsb.

Contoh C# StackOverflowException

Di bawah adalah contoh yang dinyatakan :

Contoh #1

Program C# untuk menunjukkan Pengecualian Limpahan Tindanan apabila terdapat rekursi tak terhingga berlaku pada masa larian.

Kod:

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);
}
}

Output:

C# StackOverflowException

Contoh #2

Program C# untuk menunjukkan StackOverflowException apabila terdapat rekursi tak terhingga berlaku pada masa larian walaupun selepas menggunakan blok cuba dan tangkap blok kod untuk menangkap pengecualian.

Kod:

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);
}
}
}

Output:

C# StackOverflowException

Gelung tak terhingga untuk rekursi bermula dengan menghantar sifar sebagai parameter kepada kaedah ex dalam blok cuba. Walaupun kami telah menulis blok tangkapan untuk menangkap pengecualian, ia gagal menangkap pengecualian ini kerana pengecualian ini melangkaui blok tangkapan untuk ditangkap.

Langkah-Langkah untuk Mengelakkan StackOverflowException dalam C#

  • Limpahan tindanan berlaku apabila tindanan dalam memori penuh, dan masalah ini boleh diatasi dengan menetapkan kedalaman tindanan dan penyahpepijat boleh memberikan maklumat ini.
  • Sekarang kita mempunyai peluang untuk menetapkan nilai kedalaman tindanan, kita perlu menetapkannya kepada nilai sekecil mungkin dan memerhatikan output. Jika output tidak melimpah, kita boleh menukarnya kepada nilai yang lebih besar, dan sekiranya limpahan tindanan berlaku, kita akan dapat menyahkod nilai yang sesuai untuk ditetapkan untuk kedalaman tindanan. Oleh itu untuk mencipta pengecualian yang boleh menangkap StackOverflowException, mengetahui kedalaman tindanan dengan bantuan penyahpepijat adalah satu kemestian.
  • Kod yang menyebabkan rekursi ialah punca StackOverflowException.

Atas ialah kandungan terperinci C# StackOverflowException. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:C# OutOfMemoryExceptionArtikel seterusnya:C# OutOfMemoryException