在递归方法Java中使用Scanner对象

egmofgnx  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(127)

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

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

fnvucqvd

fnvucqvd1#

这里有不少问题。

递归?不知道

递归要求每一步都必须向终点移动。这在这里不适用。因此,如果用户经常输入错误的数据,就会出现堆栈溢出异常。递归很少是合适的;肯定不在这里去掉它(使用while循环代替)。

Scanner.reset()

在开始的时候,阅读你找到的方法的文档通常是一个好主意。见鬼,即使你已经编程几十年了,这也是一个很好的建议。
reset()为例:它将扫描程序的区域设置、基数和分隔符恢复为默认值。由于您从未更改过这些值,因此它什么也不做

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

hasNextInt()方法,如果它返回false不消耗令牌-换句话说,如果用户输入一个非数字,代码将爆炸,打印相同的提示(和ERROR2)几千次,然后以StackoverflowError结束。
在响应非int的代码中,调用scanner.next()(丢弃结果)来“吃掉”非int标记。

制作大量扫描仪

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

相关问题