Xierra Marron
Xierra Marron

Reputation: 27

Validate Scanner input on a numeric range

I'm currently creating my first game which is executed in a console.

I've been asked to validate an input which can be done with a simple code. The goal is to input, and then validate if that number is an integer, and is on a range of 1-4. If possible, the problem should be solved with basic algorithm.

The problem is that it won't give me the result I wanted. It works when I enter a string, but it loops on every number I put including the number in the range. Does anyone know why?

public class Menu {

    public static void main(String[] args) {

        try (Scanner scanner = new Scanner(System.in)) {
            int input = 0;
            int min = 1;
            int max = 4;

            boolean inputValidate;

            System.out.println("Main Menu");
            System.out.println("=========");
            System.out.println("1. Play Game");
            System.out.println("2. About");
            System.out.println("3. View Saved Games");
            System.out.println("4. Exit");
            System.out.println("");

            do {
                System.out.print(">> ");
                if (!scanner.hasNextInt()) {
                    inputValidate = false;
                    System.out.println("Not a number. Please input number 1-4.");
                    scanner.nextLine();
                } else if (input <= max && !(input < min)) // if input <= 4 and input is not less than 1
                {
                    input = scanner.nextInt();
                    inputValidate = true;
                } else {
                    inputValidate = false;
                    System.out.println("Not in range. Please input number 1-4.");
                    scanner.nextLine();
                }
            } while (!(inputValidate));

            switch (input) {
                case 1:
                    break;

                case 2:
                    System.out.println("Good work!");
                    break;

                case 3:
                    break;

                case 4:
                    break;
            }

        }
    }
}

Upvotes: 1

Views: 4318

Answers (2)

Clint
Clint

Reputation: 930

Because you instantiate input to be 0, but never give the user an opportunity to change this, the conditions for the first two conditionals are always false (nothing is read from the Scanner and 0 is not between min and max). Therefore, the program falls through to the else every time. Just add a statement before the do-while that will obtain a value for input from the user.

input = scanner.nextInt();

// your do-while loop

(You'll also probably have to adjust the code slightly to get the type of interaction you're looking for. Hint - you're reading two values from the user.)

Upvotes: 2

Prokash Sarkar
Prokash Sarkar

Reputation: 11873

As Clint said the problem was in your input. Here's a demo how you can fix this,

try (Scanner scanner = new Scanner(System.in)) {

            int input = 0;
            int min = 1;
            int max = 4;

            boolean inputValidate = false;

            System.out.println("Main Menu");
            System.out.println("=========");
            System.out.println("1. Play Game");
            System.out.println("2. About");
            System.out.println("3. View Saved Games");
            System.out.println("4. Exit");
            System.out.println("");

            do {
                System.out.print(">> ");

                try {
                    input = scanner.nextInt();
                    if (input >= min && input <= max) {
                        inputValidate = true;
                    } else {
                        System.out
                                .println("Not in range. Please input number 1-4.");
                        scanner.nextLine();
                    }
                } catch (InputMismatchException exception) {
                    System.out
                            .println("Not a number. Please input number 1-4.");
                    scanner.nextLine();
                }

            } while (!(inputValidate));

Upvotes: 2

Related Questions