在C#,C ++和Java中导致堆栈溢出的最简单方法

我正在看一个C#教程,遇到了StackOverflowException。

叙述者使用下面的代码片段给出了这样一个例外的简洁例子,

public class Employee { private string _name; public string Name { get{ return Name; } } } 

我正在寻找C ++和Java中这种简单代码的一些例子,更特别是在javascript中可能导致Stack Overflow。

在Java中:

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

通常,任何不终止或迭代次数过多的递归函数都会导致此问题。

这个解释是Java,C,C ++语言的StackOverflowException背后的基本原因。

由于递归方法调用,Stackoverflowexception是由任何语言引起的。

假设您有一个调用自身的方法或无限递归循环的任何其他方法,那么它将导致Stacoverflowexception。 这背后的原因是方法调用堆栈被填充,它将无法容纳任何其他方法调用。

方法调用堆栈看起来像这张图片。

在此处输入图像描述

解释 – 假设Main方法有五个语句,第三个方法调用methodA,然后main语句的执行在statement3处暂停,MethosA将被加载到调用堆栈中。 然后方法A调用methodB。 所以methodB也被加载到堆栈中。

因此,通过这种方式,无限递归调用使得调用堆栈得到填充。 所以它无法承受更多的方法。 所以它抛出StackOverflowException。

对于您的代码段,这是由于递归方法调用:

 public string Name { get{ return Name; } } 

您以递归方式调用Name方法/属性。 堆栈填满(使用父Name方法),直到它溢出并抛出StackOverflowException

 public string Name { get{ return Name; } } 

此属性使用return Name;调用自身return Name; 。 这导致无限递归。 这就是为什么当你使用这个属性时,你会得到StackOverflowException 。 我相信这个属性的正确使用应该;

 public string Name { get{ return _name; } } 

抛出执行堆栈溢出错误的StackOverflowException,通常是在非常深或无限递归的情况下。

从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,并且默认情况下会终止相应的进程。 因此,建议用户编写代码以检测并防止堆栈溢出。 例如, 如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环