zhubiii
zhubiii

Reputation: 25

How to have check user input using scanner without having scanner prompt multiple times

So im writing a couple methods that require the user to input what hour(1-24) they want. I need however to check whether they enter in an int, and a number between 1-24. The problem is that the scanners are called multiple times if sent to the error statement. I don't know how to do this without having these issues.

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;
    }

Ideally it only prompts one time when entering in a not valid input such as a string or int outside of 1-24. but it prompts twice or sometimes once depending on the order of what incorrect input you put in.

Any help would be appreciated, thanks

Upvotes: 1

Views: 167

Answers (1)

L. Teder
L. Teder

Reputation: 1045

You're encountering this problem because .hasNextInt() does not advance past the input, and .nextInt() only advances if translation is successful. A combination of loops and if-statements can thus cause confusion as to whether or not the scanner will advance. Here's your method rewritten to have the scanner prompt only once for each bad input:

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: ");
    }
}

I prefer to use an infinite loop in this case, but as that can be dangerous, receive it with caution. Hope this helps!

Upvotes: 1

Related Questions