下午好,我实现了一种使用扫描仪读取用户键盘输入的方法。用户必须仅组合从 1 到 3 的数字(数组中给出的答案选项)。如果用户没有输入数字,则应显示通知并重试相同的方法。如果输入了数字,它将作为方法的返回值返回。在方法的底部有一个存根 100,它根本不应该进入它,但该方法的行为非常奇怪。如果用户没有输入数字,则递归开始,如果此后他仍然输入数字,则出于某种原因返回相同的值 100。同时,我在递归的每次迭代中重置扫描仪。我尝试关闭扫描仪,但没有任何变化。在我看来,由于某种原因,旧扫描仪没有重置其值。
方法:
private int readUserColumn(){
System.out.println("Enter value");
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextInt()){
int column = scanner.nextInt();
if (_variants.contains(column)){
scanner.reset();
return column;
}
else {
System.out.println("ERROR1");
printMatrix();
scanner.reset();
readUserColumn();
}
}
else {
System.out.println("ERROR2");
scanner.reset();
readUserColumn();
}
return 100; //shouldn't go here
}
我尝试关闭扫描仪,但没有任何变化。在我看来,由于某种原因,旧扫描仪没有重置其值。
这里有不少问题
递归要求每一步都必然走向终点。这在这里不适用。因此,如果用户经常输入错误数据,就会出现堆栈溢出异常。递归很少适用;它肯定不在这里。摆脱它(改用
while
循环)。
开始时,阅读您找到的方法的文档通常是个好主意。哎呀,即使你已经编程了几十年,这也是个好建议。
reset()
:它将扫描器的区域设置、基数和定界符恢复为默认值。鉴于您从未更改过这些值,它什么都不做.
reset
的误解)hasNextInt()
方法,如果它返回false
,不消耗令牌——换句话说,如果用户输入一次非数字,代码将爆炸,打印相同的提示(和ERROR2
) 几千次然后以 StackoverflowError
结束。
在您响应非整数的代码中,调用
scanner.next()
(丢弃结果)以“吃掉”非整数令牌。
不要那样做 - 制作一个扫描仪并将其作为参数传递,或将其分配给一个字段。