进程因 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 如果他们想继续。