有谁知道使用递归调用时无限循环和StackOverflow错误发生了什么?

问题描述

这是我正在练习的程序的一部分,它的目的并不重要。
我已将Scanner声明为该类的字段**(抱歉,此处未写)。
我想制作一个返回指定给用户输入答案的方法。我想进行所有必要的检查,以便用户无法输入字符或符号,而只能输入整数。当输入的数据类型错误时,我希望用户再次尝试输入。

public static void Answer() {

System.out.println("\n\t1.It was good! \n\t2.Kinda bad too...");
System.out.println();

if (scanner.hasNextInt()) {

  int choice = scanner.nextInt();

  switch (choice) {
  case 1:
    System.out.println("Oh great!");
    break;
  case 2:
    System.out.println("I see you as well");
    break;
  default:
    System.out.println("Please select a valid answer :");
    Answer();
    break;
  } else {

    System.out.println("Please select a number,characters are not acceptable!");

    Answer();

  }

当我输入无效数字(例如3,4等)时,该算法会触发switch块和递归调用效果很好! 但是,当我输入字符时,它会触发无限递归调用,而不会让我从扫描仪输入新输入,并最终出现 StackOverflow 错误

解决方法

您检查扫描仪是否具有int。如果不是,则转到else分支。

else分支中,它再次调用Answer()。但这很重要:您的扫描器 still 没有int。因此scanner.hasNextInt()返回falsehasNextInt()不会尝试读取任何内容,它只是检查是否是否存在可以解释为int的输入。 (来源:Java documentation)。

因此,程序再次转到else分支,而没有到达可以尝试读取输入内容的地步……然后再次调用Answer()。现在,代码仍然没有int ...因此,scanner.hasNextInt()再次返回false,并转到else分支。再一次,它不会到达扫描程序使用输入的部分,而是会再次到达它调用Answer()的部分...

这将继续,直到调用堆栈已满并且您收到StackOverflow错误。

您必须注意用户输入的内容不是int的情况。您必须使用不是int的输入。

顺便说一句,我宁愿使用迭代而不是递归来进行此操作。