-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 背后的基本原因。

由于递归方法调用,通常在任何语言中都会导致堆栈溢出异常。

假设您有一个方法正在调用自身或任何其他无限递归循环的方法;这将导致 Stackoverflow 异常。这背后的原因是方法调用堆栈被填满,它将无法容纳任何其他方法调用。

方法调用堆栈如下图所示。

在此处输入图像描述

解释-- 假设 Main 方法有五个语句,并且第三个方法调用了 methodA,那么 Main 方法的执行在 statement3 处暂停,methodA 将被加载到调用堆栈中。然后方法 A 调用了方法 B。所以 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方法),直到溢出并StackOverflowException抛出 a 。

于 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 回答