Algorithm

prompt for, accept, and store input

while (the input is invalid)
{
    display an error message

    prompt for, accept, and store input
}

When the loop terminates (after 0 or more runs) the stored input is valid.

Simple example

The example below assumes that fromKeyboard has been declared and initialized as a Scanner reading from the keyboard.

System.out.print("Enter an integer from 1 to 10 (inclusive): ");
int number = fromKeyboard.nextInt();
fromKeyboard.nextLine();

while(number < 1 || number > 10)
{
    System.out.println("\n" + number + " is not within range.");
    
    System.out.print("Enter an integer from 1 to 10 (inclusive): ");
    number = fromKeyboard.nextInt();
    fromKeyboard.nextLine();
}

System.out.println(number + " is valid");

The variable number stores both the initial input and any subsequent inputs. number is declared and initialized before the loop. Within the loop, number is set to the new input. number is not declared again inside the loop.

The calls to nextLine are intended to remove the line separator from the input stream. Although this example would work without the calls to nextLine, including them allows other code that uses the same Scanner object to take String input without causing the error discussed at Keyboard input with mixed types.

Execution with invalid input

When the code segment above is run with the inputs -5 (invalid), 15 (invalid), then 5 (valid), the interaction is shown below.

Enter an integer from 1 to 10 (inclusive): -5

-5 is not within range.
Enter an integer from 1 to 10 (inclusive): 15

15 is not within range.
Enter an integer from 1 to 10 (inclusive): 5
5 is valid

Execution with valid input first

If the user enters 5 (valid) at the first prompt, the loop condition evalutes to false the first time it is checked and the loop body does not run. This is the desired behavior.

Enter an integer from 1 to 10 (inclusive): 5
5 is valid

Handling non-numeric input

The example above correctly handles any invalid numeric input (ex: -5, 15). If the user enters a non-numeric input (ex: hamster), nextInt crashes with an InputMismatchException.

Input validation as String explains how to handle (invalid) non-numeric input.

Example with specific valid values

System.out.print("Play or quit? (p/q): ");
String response = fromKeyboard.nextLine();

while( ! response.equals("p") && ! response.equals("q") )
{
    System.out.println("\nInvalid input");
    
    System.out.print("Play or quit? (p/q): ");
    response = fromKeyboard.nextLine();
}

System.out.println("User chose: " + response);

The loop condition checks that the input is not equal to "p" and (&&) not equal to "q". Using or (||) instead would result in a condition that always evaluates to true.

Comments

Comment on Input validation