在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对象,并且默认情况下会终止相应的进程。 因此,建议用户编写代码以检测并防止堆栈溢出。 例如, 如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环 。