我正试图研究导致例外发生的原因
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异常。
我在讲座中做了类似的事情,导致了堆栈溢出异常,但这段代码没有。这意味着它无法添加到堆栈中。我如何以导致堆栈溢出异常的方式编写此代码?
答案 0 :(得分:1)
因为简单地运行循环不会向堆栈添加任何内容。
如果它是一个无限递归方法,你会得到一个StackOverflowException
。
为什么?因为执行堆栈的工作方式 - 它堆栈要执行的方法
假设以下代码:
public void A()
{
B();
}
public void B()
{
C();
}
public void C()
{
// do some stuff.
}
现在,当您调用方法A
时,它会执行B
,将A
留在执行堆栈中。 B
执行C
,将A
和B
都保留在执行堆栈中,
当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!");
}