在C#,C++;和爪哇
我在看C#教程时遇到了StackOverflowException 叙述者使用下面的代码片段给出了一个此类异常的简洁示例在C#,C++;和爪哇,c#,java,javascript,c++,C#,Java,Javascript,C++,我在看C#教程时遇到了StackOverflowException 叙述者使用下面的代码片段给出了一个此类异常的简洁示例 public class Employee { private string _name; public string Name { get{ return Name; } } } 我想找一些C++和java中的简单代码,特别是JavaScript中的一些导致堆栈溢出的例子。 此解释是java、C++和C++的StAccOff
public class Employee
{
private string _name;
public string Name
{
get{ return Name; }
}
}
我想找一些C++和java中的简单代码,特别是JavaScript中的一些导致堆栈溢出的例子。
<强>此解释是java、C++和C++的StAccOffFoULT异常背后的根本原因。< /强>
在任何语言中,由于递归方法调用,通常都会导致堆栈溢出异常 假设您有一个方法,该方法正在为无限递归循环调用自身或任何其他方法;它将导致Stackoverflowexception。这背后的原因是方法调用堆栈被填满,它将无法容纳任何其他方法调用 方法调用堆栈如下图所示。 解释——假设Main方法有五条语句,第三个方法调用methodA,那么Main方法的执行将在statement3处暂停,methodA将加载到调用堆栈中。然后方法A调用了方法B。因此methodB也被加载到堆栈中因此,通过这种方式,无限递归调用会使调用堆栈填满,此时它无法提供更多的方法。因此它抛出一个StackOverflowException。对于您的代码段,这是由于递归方法调用:
public string Name
{
get{ return Name; }
}
您正在递归调用名称
方法/属性。堆栈将填满(使用父名称
方法),直到溢出并引发堆栈溢出异常
public string Name
{
get{ return Name; }
}
此属性使用返回名称调用自身代码>。这会导致无限递归。这就是为什么当你使用这个属性时,你会得到。我认为该物业的正确用途应为:
public string Name
{
get{ return _name; }
}
针对执行堆栈溢出错误引发StackOverflowException,
通常在非常深或无限递归的情况下
从.NET Framework 2.0版开始,StackOverflowException
对象不能被try-catch块和相应的
默认情况下,进程被终止。因此,建议用户
编写代码以检测和防止堆栈溢出。例如
如果应用程序依赖递归,请使用计数器或状态
终止递归循环的条件
在Java中:
public class Test {
public static void main(String[] args) {
main(args);
}
}
一般来说,任何没有终止或迭代次数过多的递归函数都会导致此问题。递归:请参阅递归。只需用任何语言编写一个没有中断条件的递归函数,它就会产生异常。@GuruKara,有尾部递归的语言除外。+1回答很好。请注意,优化的语言可能不会在问题中抛出SO on函数。解释一下为什么\u name
应该在name
不起作用的情况下起作用,这将有助于回答这个问题。