我的代码无法解决这个问题。
我正在进行测验,但问题不应该被问到两次,所以我避免了这个问题,但是当它用完选项时就崩溃了。
它也可能是之后的代码,但我不这么认为。
这是我的代码:
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();
}
}
如果您需要更多代码来帮助我,请问我。
提前致谢!
答案 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
。