进程因 StackOverflowExeption 而终止 - C#
Process is terminated due to StackOverflowExeption - C#
我的代码有这个问题,我无法修复。
我正在做一个测验,但问题不能问两次所以我避免了,但是当它用完选项时它崩溃了。
也可能是后面的代码,但我不这么认为。
这是我的代码:
private static void chooseQuestion()
{
Random randomQuestion = new Random();
int returnValue = randomQuestion.Next(1, 3);
switch (returnValue)
{
case 1:
if (randomValues.questionOneChosen != 1)
{
questionOne();
}else
{
chooseQuestion();
}
break;
case 2:
if (randomValues.questionTwoChosen != 1)
{
questionTwo();
}else
{
chooseQuestion();
}
break;
}
endQuiz();
}
下面是它后面的内容:
private static void endQuiz()
{
Console.Clear();
Console.WriteLine();
text.centered("You completed the QUIZ, well done!");
Console.WriteLine();
text.centeredWrite("Press ENTER to go back to the menu");
string input = Console.ReadLine();
if (input == "")
{
Menu.main();
}else
{
endQuiz();
}
}
如果您需要更多代码来帮助我,请询问我。
提前致谢!
这永远不会设置。
randomValues.questionOneChosen
所以不管它是什么,如果它不是 1 或 2,该方法将再次调用自身。它可能总是零。
你的 chooseQuestion
方法的逻辑是这样的:
a. Pick a 1 or 2, randomly
b. If 1, and I haven't asked question 1 yet, show question 1
c. if 1, and I have asked question 1, go to step (a)
d. repeat (b) and (c) for question 2
...
回答完这两个问题后,您将尝试获得另一个随机问题。但是没有更多的问题可用。所以你递归到一个异常。
不要这样写你的逻辑。使用集合,并在显示该问题后从集合中删除该项目。当集合为空时,您就完成了。
Whosebug 上的 WhosebugException,很好!
Menu.main() 最终会调用 chooseQuestion() 吗?
调用函数时,会在堆栈上创建一个新条目,为其所有局部变量和 return 到 return 的地址留出空间。如果一个函数调用自身(递归调用),它原来的堆栈入口不会被释放。如果它在没有 returning 的情况下足够频繁地调用自身,堆栈最终将 运行 空间不足并给出此异常。话虽如此,堆栈相当大——我认为默认值是 1 兆字节——所以你需要大量的递归调用来耗尽它。
你有两个函数,它们都调用自己。如果他们经常这样做,您将 运行 出栈 space。只需用循环替换递归调用即可。这是您的第一个函数:
private static void chooseQuestion()
{
bool endQuizChosen = false;
while ( !endQuizChosen ) {
Random randomQuestion = new Random();
int returnValue = randomQuestion.Next(1, 3);
// ... the rest of the function ...
endQuizChosen = endQuiz();
}
}
并编辑 endQuiz()
不调用自身,而是 return true
如果用户想停止,false
如果他们想继续。
我的代码有这个问题,我无法修复。
我正在做一个测验,但问题不能问两次所以我避免了,但是当它用完选项时它崩溃了。
也可能是后面的代码,但我不这么认为。
这是我的代码:
private static void chooseQuestion()
{
Random randomQuestion = new Random();
int returnValue = randomQuestion.Next(1, 3);
switch (returnValue)
{
case 1:
if (randomValues.questionOneChosen != 1)
{
questionOne();
}else
{
chooseQuestion();
}
break;
case 2:
if (randomValues.questionTwoChosen != 1)
{
questionTwo();
}else
{
chooseQuestion();
}
break;
}
endQuiz();
}
下面是它后面的内容:
private static void endQuiz()
{
Console.Clear();
Console.WriteLine();
text.centered("You completed the QUIZ, well done!");
Console.WriteLine();
text.centeredWrite("Press ENTER to go back to the menu");
string input = Console.ReadLine();
if (input == "")
{
Menu.main();
}else
{
endQuiz();
}
}
如果您需要更多代码来帮助我,请询问我。
提前致谢!
这永远不会设置。
randomValues.questionOneChosen
所以不管它是什么,如果它不是 1 或 2,该方法将再次调用自身。它可能总是零。
你的 chooseQuestion
方法的逻辑是这样的:
a. Pick a 1 or 2, randomly
b. If 1, and I haven't asked question 1 yet, show question 1
c. if 1, and I have asked question 1, go to step (a)
d. repeat (b) and (c) for question 2
...
回答完这两个问题后,您将尝试获得另一个随机问题。但是没有更多的问题可用。所以你递归到一个异常。
不要这样写你的逻辑。使用集合,并在显示该问题后从集合中删除该项目。当集合为空时,您就完成了。
Whosebug 上的 WhosebugException,很好! Menu.main() 最终会调用 chooseQuestion() 吗? 调用函数时,会在堆栈上创建一个新条目,为其所有局部变量和 return 到 return 的地址留出空间。如果一个函数调用自身(递归调用),它原来的堆栈入口不会被释放。如果它在没有 returning 的情况下足够频繁地调用自身,堆栈最终将 运行 空间不足并给出此异常。话虽如此,堆栈相当大——我认为默认值是 1 兆字节——所以你需要大量的递归调用来耗尽它。
你有两个函数,它们都调用自己。如果他们经常这样做,您将 运行 出栈 space。只需用循环替换递归调用即可。这是您的第一个函数:
private static void chooseQuestion()
{
bool endQuizChosen = false;
while ( !endQuizChosen ) {
Random randomQuestion = new Random();
int returnValue = randomQuestion.Next(1, 3);
// ... the rest of the function ...
endQuizChosen = endQuiz();
}
}
并编辑 endQuiz()
不调用自身,而是 return true
如果用户想停止,false
如果他们想继续。