在递归方法 Java 中使用扫描仪对象

问题描述 投票:0回答:1

下午好,我实现了一种使用扫描仪读取用户键盘输入的方法。用户必须仅组合从 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
    }

我尝试关闭扫描仪,但没有任何变化。在我看来,由于某种原因,旧扫描仪没有重置其值。

java recursion java.util.scanner
1个回答
0
投票

这里有不少问题

递归?号

递归要求每一步都必然走向终点。这在这里不适用。因此,如果用户经常输入错误数据,就会出现堆栈溢出异常。递归很少适用;它肯定不在这里。摆脱它(改用

while
循环)。

Scanner.reset()

开始时,阅读您找到的方法的文档通常是个好主意。哎呀,即使你已经编程了几十年,这也是个好建议。

Take

reset()
:它将扫描器的区域设置、基数和定界符恢复为默认值。鉴于您从未更改过这些值,它什么都不做.

代码不起作用(因为对
reset
的误解)

hasNextInt()
方法,如果它返回
false
不消耗令牌——换句话说,如果用户输入一次非数字,代码将爆炸,打印相同的提示(和
ERROR2 
) 几千次然后以
StackoverflowError
结束。

在您响应非整数的代码中,调用

scanner.next()
(丢弃结果)以“吃掉”非整数令牌。

制作大量扫描仪

不要那样做 - 制作一个扫描仪并将其作为参数传递,或将其分配给一个字段。

© www.soinside.com 2019 - 2024. All rights reserved.