使用while循环导致堆栈溢出

时间:2018-01-15 12:24:17

标签: c#

我正试图研究导致例外发生的原因

Console.WriteLine("Please enter your name.");
string playerName = Console.ReadLine();
                while (playerName.Length == 0)
                {
                    Console.WriteLine("Don't be a ****, enter a name!");
                }

此代码编译时不会导致Stack Overflow异常。

我在讲座中做了类似的事情,导致了堆栈溢出异常,但这段代码没有。这意味着它无法添加到堆栈中。我如何以导致堆栈溢出异常的方式编写此代码?

2 个答案:

答案 0 :(得分:1)

因为简单地运行循环不会向堆栈添加任何内容。

如果它是一个无限递归方法,你会得到一个StackOverflowException。 为什么?因为执行堆栈的工作方式 - 它堆栈要执行的方法 假设以下代码:

public void A()
{
    B();
}

public void B()
{
    C();
}

public void C()
{
   // do some stuff.
}

现在,当您调用方法A时,它会执行B,将A留在执行堆栈中。 B执行C,将AB都保留在执行堆栈中, 当C完成并且B完成时,只有B从执行堆栈中删除。以同样的方式,当A最终完成时,它将从执行堆栈中删除。

现在堆栈非常深,所以它通常只会溢出无限递归。

由于您的循环再次启动之前对Console.WriteLine的调用已完成,因此迭代之间堆栈中没有任何内容,因此没有堆栈溢出。

导致堆栈溢出的一种简单方法是使用递归,因为递归方法调用将被堆叠,直到递归到达它的停止条件并开始在递归链上返回值。如果缺少该停止条件(无限递归)或在路上太远,堆栈将溢出。

来自StackOverflowException文档页面:

  

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

答案 1 :(得分:0)

尝试:

var playerName = "";
while ((playerName = Console.ReadLine())?.Length == 0)
{
    Console.WriteLine("Don't be a ****, enter a name!");
}