Java while 循环之外的扫描程序

Scanner outside Java while loop

提问人:marcof 提问时间:1/8/2023 更新时间:1/8/2023 访问量:110

问:

我正在创建一种方法,让用户通过与数字相关的 2 个选项来选择他想做的事情。如果用户在输入中插入任何字符串,我的代码会打印无限:

Choose an optionError
1 - New game
2 - Load game

在所有其他情况下,代码都能正常工作,所以我认为错误出在catch()中。我尝试在代码的某些部分使用指令关闭 Scanner 对象,但问题仍然存在。

相反,如果我在 Start() 方法的 while 循环中声明 Scanner 对象,则代码可以完美运行。我无法弄清楚扫描仪对象是如何工作的以及为什么我会遇到这个问题。

import java.util.Scanner;

public class Metods {

    static Scanner input = new Scanner(System.in);

    public static int Start() {
        while(true) {
            
            int choice;
    
            System.out.println("1 - New game");
            System.out.println("2 - Load game");
            System.out.print("\nChoose an option");
    
            try {
                choice = input.nextInt();
                //input.close();
            } catch (Exception e) {
                System.out.println("Error");
                //input.close();
                continue;
            }

            if (choice == 1 || choice == 2) {
                //input.close();
                return choice;
            }
            else {
                System.out.println("Error");
                //input.close();
            }
        }
    }


}```
java while-loop try-catch java.util.scanner

评论

0赞 Gaël J 1/8/2023
你永远不会走出无限循环。break

答:

1赞 gemorra 1/8/2023 #1

在每个循环圈中,您都在尝试再次解析输入。 nextInt() 方法抛出异常,但输入仍未处理,因此下一个循环圈再次尝试解析输入......

您应该将输入读取为 String,检查它是否是有效选项(1 或 2)并以整数形式返回该选项(如果需要),否则循环将再次开始等待新输入,因为您的输入被篡改了。

我刚刚更改了相关部分。

 public static int start() {
        while(true) {

            String choice;

            System.out.println("1 - New game");
            System.out.println("2 - Load game");
            System.out.print("\nChoose an option");

            try {
                choice = input.next();
                //input.close();
            } catch (Exception e) {
                System.out.println("Error");
                //input.close();
                continue;
            }

            if (choice.equals("1") || choice.equals("2")){
                //input.close();
                return Integer.parseInt(choice);
            }
            else {
                System.out.println("Error");
                //input.close();
            }
        }
    }
0赞 user18256711 1/8/2023 #2

因为nextInt读取的数据不是整数,而是数据不会自动跳过。

您可以使用 input.next() 方法跳过错误的字符

    static Scanner input = new Scanner(System.in);

    public static int Start() {
        while(true) {
            int choice;
    
            System.out.println("1 - New game");
            System.out.println("2 - Load game");
            System.out.print("\nChoose an option");
    
            try {
                choice = input.nextInt();
                //input.close();
            } catch (Exception e) {
                System.out.println("Error");
                if( input.hasNext() ) {
                    input.next();
                }
                //input.close();
                continue;
            }

            if (choice == 1 || choice == 2) {
                //input.close();
                return choice;
            }
            else {
                System.out.println("Error");
                //input.close();
            }
        }
    }

评论

0赞 marcof 1/8/2023
谢谢,这很有帮助,但我不明白为什么扫描仪会这样。因此,如果我不打算,在出现异常的情况下,扫描仪将先前读取的输入保留在内存中,并且在新的 next() 或 nextLine() 指令的情况下,扫描仪会读取已保存的此内容,并且用户无法输入其他任何内容,对吗?
0赞 gemorra 1/8/2023
没错,就像我在回答中所说的那样,输入没有被处理,而是“粘”在扫描仪中。您可以处理 catch 子句中的“错误”输入,例如,用于记录哪个输入引发了异常