如何在不多次出现扫描仪提示的情况下使用扫描仪检查用户输入

时间:2019-04-28 18:28:02

标签: java

因此,我正在编写一些方法,要求用户输入所需的时间(1-24)。但是,我需要检查它们是否输入int,以及1-24之间的数字。问题是,如果将扫描程序发送到错误语句,则会被多次调用。没有这些问题,我不知道该怎么做。

public static int getHour(Scanner scan){
        int hour=0;
        System.out.println("Enter the hour for the showtime (1-24):");
        do{
            if((!scan.hasNextInt())||((hour=scan.nextInt())<1)||(hour>24)){
                System.out.println("Enter a valid number");
                scan.next();
            }  else{
                return hour;
            }           
        }while((!scan.hasNextInt())||(hour<1)||(hour>24));        
          return hour;
    }

理想情况下,当输入无效输入(例如1-24之外的字符串或整数)时,它仅提示一次。但它会提示两次或有时提示一次,具体取决于您输入的错误输入的顺序。

任何帮助将不胜感激,谢谢

1 个答案:

答案 0 :(得分:1)

您遇到此问题是因为.hasNextInt()不会超过输入,并且.nextInt()仅在翻译成功的情况下才会前进。因此,循环和if语句的组合可能会导致扫描仪是否前进的混乱。这是您的方法被重写为对于每个错误的输入仅使扫描程序提示一次:

public int getHour(Scanner scan) {
    System.out.printf("%nEnter the hour for the showtime (1-24): ");
    while (true) {
        input = scan.next();
        entry = -1;
        try {
            entry = (int)Double.parseDouble(input);
        } catch (NumberFormatException e) {
            // Ensures error is printed for all bad inputs
        }
        if (entry >= 1 && entry <= 24) {
            return entry;
        }
        System.out.printf("%nEnter a valid number: ");
    }
}

在这种情况下,我更喜欢使用无限循环,但是这样做可能很危险,因此请谨慎使用。希望这会有所帮助!