下午好,我实现了一个方法,其中使用扫描器读取用户从键盘输入的内容。用户必须仅组合从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
}
我试着关闭扫描仪,但没有任何变化。在我看来,由于某种原因,旧扫描仪没有重置其值。
1条答案
按热度按时间fnvucqvd1#
这里有不少问题。
递归?不知道
递归要求每一步都必须向终点移动。这在这里不适用。因此,如果用户经常输入错误的数据,就会出现堆栈溢出异常。递归很少是合适的;肯定不在这里去掉它(使用
while
循环代替)。Scanner.reset()
在开始的时候,阅读你找到的方法的文档通常是一个好主意。见鬼,即使你已经编程几十年了,这也是一个很好的建议。
以
reset()
为例:它将扫描程序的区域设置、基数和分隔符恢复为默认值。由于您从未更改过这些值,因此它什么也不做。代码不工作(因为对
reset
的误解)hasNextInt()
方法,如果它返回false
,不消耗令牌-换句话说,如果用户输入一个非数字,代码将爆炸,打印相同的提示(和ERROR2
)几千次,然后以StackoverflowError
结束。在响应非int的代码中,调用
scanner.next()
(丢弃结果)来“吃掉”非int标记。制作大量扫描仪
不要这样做-做一个扫描仪,并将其作为参数传递,或将其分配给一个字段。