问题描述
这是我正在练习的程序的一部分,它的目的并不重要。
我已将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()
返回false
。 hasNextInt()
不会尝试读取任何内容,它只是检查是否是否存在可以解释为int
的输入。
(来源:Java documentation)。
因此,程序再次转到else
分支,而没有到达可以尝试读取输入内容的地步……然后再次调用Answer()
。现在,代码仍然没有int
...因此,scanner.hasNextInt()
再次返回false,并转到else
分支。再一次,它不会到达扫描程序使用输入的部分,而是会再次到达它调用Answer()
的部分...
这将继续,直到调用堆栈已满并且您收到StackOverflow错误。
您必须注意用户输入的内容不是int
的情况。您必须使用不是int
的输入。
顺便说一句,我宁愿使用迭代而不是递归来进行此操作。