【问题标题】:Getting Infinite Loop Issue. Process Terminated due to StackOverflowException?获得无限循环问题。进程因 StackOverflowException 而终止?
【发布时间】:2014-11-18 22:18:54
【问题描述】:
namespace ConsoleApplication1
{

class class1
{
    protected internal string inf1()
    {
        Console.WriteLine("\n......inf1() \n");

        return inf1();
    }
}




class class2 :class1
{
    static void Main(string[] args)
    {
        class1 c1 = new class1();

        class2 c2 = new class2();

        Console.WriteLine(c1.inf1());

        Console.WriteLine(c2.inf1());

        Console.ReadKey();
    }
}

遇到无限循环问题。进程因StackOverflowException而终止?

如何防止代码无限循环?

【问题讨论】:

  • 是的,inf1 被递归调用,因此导致无限循环,因此堆栈溢出是预期的行为。您有什么问题或不明白的地方?
  • 你的代码显然有一个无限递归,方法inf1总是自己执行,你到底希望发生什么?
  • 这有什么意义?您是在尝试调用父类中的方法还是什么?
  • 是的,我正在尝试调用父类中的方法

标签: c# exception stack-overflow infinite-loop


【解决方案1】:

class2 中,您正在调用Console.WriteLine(c1.inf1());

所以class1.inf1 应该在您尝试将其输出到控制台时返回一个字符串。

但是,class1.inf1() 递归调用自身,不退出且不返回字符串。

所以我认为这可能是你想要完成的:

protected internal string inf1()
{
    return "\n......inf1() \n";
}

【讨论】:

  • 感谢您的帮助。现在我明白了无限循环背后的原因。
【解决方案2】:

问题就在这里:

protected internal string inf1()
{
    Console.WriteLine("\n......inf1() \n");
    return inf1();
}

此方法每次都会返回对自身的调用,这意味着它将被无限期地调用。这样做的问题是程序在进入方法之前将其在内存上的当前位置添加到堆栈中,以便当方法返回时它可以返回该位置并从那里继续,但该堆栈不是无限的并且因此,使用有问题的方法,它会变满,然后程序崩溃,因为没有堆栈它无法继续运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    相关资源
    最近更新 更多