由于StackOverflowExeption终止进程 - C#

时间:2016-05-11 18:47:01

标签: c# crash stack-overflow

我的代码无法解决这个问题。

我正在进行测验,但问题不应该被问到两次,所以我避免了这个问题,但是当它用完选项时就崩溃了。

它也可能是之后的代码,但我不这么认为。

这是我的代码:

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();
    }
}

如果您需要更多代码来帮助我,请问我。

提前致谢!

3 个答案:

答案 0 :(得分:0)

这永远不会被设定。

randomValues.questionOneChosen

无论如何,如果它不是1或2,那么该方法将再次调用自己。它可能总是零。

答案 1 :(得分:0)

您的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
...

一旦你回答了这两个问题,你就会尝试另外一个问题。但现在没有其他问题了。所以你进入一个例外。

不要这样写你的逻辑。使用集合,并在您显示该问题后从集合中删除该项目。当集合为空时,您已完成。

答案 2 :(得分:0)

StackOverflow上的StackOverflowException,太好了! Menu.main()最终调用chooseQuestion()吗? 调用函数时,会创建堆栈上的新条目,其中包含所有局部变量的空间以及返回时返回的地址。如果函数调用自身(递归调用),则不会释放其原始堆栈条目。如果它经常调用自己而不返回,那么堆栈最终会耗尽空间并给出这个异常。话虽如此,堆栈非常大 - 我认为默认值是1兆字节 - 所以你需要大量的递归调用才能耗尽它。

你有两个自称的功能。如果他们经常这样做,你就会耗尽堆栈空间。只需用循环替换递归调用即可。这是你的第一个功能:

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()以便不会自行调用,但如果用户想要停止则返回true,如果他们想要继续,则返回false