通常我会按照此行进行验证:
public static void Menu()
{
Scanner keyboard = new Scanner(System.in);
if (!keyboard.hasNextInt())
{
System.out.println("Incorrect input, try again");
Menu();
}
else
{
// switch statement etc
}
}
我只是想知道这是一种不好的做法吗?如果是这样的话,为什么以及除了使用递归之外还有什么更好的方法。我已经使用递归来获得数字和其他一些东西的力量,所以我理解它的想法。
答案 0 :(得分:9)
这是递归,在这种情况下这是一个不好的做法,因为如果您输入的错误数据太多次,您将以堆栈溢出异常结束。请尝试while
循环:
Scanner scanner = new Scanner(System.in);
int choice = 0;
while (scanner.hasNext()) {
if(scanner.hasNextInt()) {
choice = scanner.nextInt();
break;
}
System.out.println("Incorrect input, try again");
scanner.next();
}
scanner.close();
// switch statement etc
switch(choice) {
//...
}
这将只创建一个Scanner
实例,并且会一直运行,直到输入一些有效值。
在满足这些条件的情况下保持递归:
循环的性能通常也更好,但是如果你使用递归,你应该在发现重大性能损失之前很久就应该满足堆栈溢出。
答案 1 :(得分:1)
在这种情况下,我会说是。
编辑://慢化
答案 2 :(得分:0)
当递归调用的数量未修复时,这种类型的递归很糟糕。经过一些错误的尝试后,您可能会遇到OutOfMemoryError
异常。所以最好找一个替代方案,或者如果你必须像这样使用递归,那么放一个允许你尝试一定次数的counter
。
答案 3 :(得分:0)
关于使用递归算法的要点不是调用自身的方法,而是更像是将一些结果返回给自身以进行进一步处理的方法:有一个调用堆栈正在构建但在某种程度上(希望如此) recusion终止,结果传回堆栈以生成最终结果。
你的例子只是通过反复调用Menu()
来构建一个调用堆栈,但是没有传回结果,所以在我看来这根本不是正确的递归,但它只会填满你的堆栈无用的混乱。
答案 4 :(得分:-2)
循环总是比递归更好。在递归中,内部堆栈被构建。 递归也需要一个方法子例程跳转,它比循环
慢