简体   繁体   中英

checking if input from scanner is int with while loop java

I basically want the following while loop to check if the input is an integer. It cannot contain decimals because it is pointing to an array. If the value entered is a decimal it should prompt the user again. Problem is I get two prompts before the while loop starts with this code. Any ideas?

      System.out.print("Enter month (valid values are from 1 to 12): ");
    Scanner monthScan = new Scanner(System.in);
    int monthInput = monthScan.nextInt();
    // If the month input is below 1 or greater than 12, prompt for another value
    while(monthInput<1 || monthInput>12 || !monthScan.hasNextInt())
    {
        System.out.print("Invalid value! Enter month (valid values are from 1 to 12): ");
        monthInput = new Scanner(System.in).nextInt();
    }

thanks

EDIT: The current output gives the following:

Enter month (valid values are from 1 to 12): 2
2

Notice how I had to enter 2 twice even though it is a valid value.

Check that the input is integer with hasNextInt() before you call nextInt() . Otherwise nextInt() throws an InputMismatchException when user types a non integer.

int monthInput;

System.out.print("Enter month (valid values are from 1 to 12): ");
Scanner monthScan = new Scanner(System.in);

if (monthScan.hasNextInt()) {
    monthInput = monthScan.nextInt();
} else {
    monthScan.next();   // get the inputted non integer from scanner
    monthInput = 0;
}

// If the month input is below 1 or greater than 12, prompt for another value
while (monthInput < 1 || monthInput > 12) {
    System.out.print("Invalid value! Enter month (valid values are from 1 to 12): ");
    if (monthScan.hasNextInt()) {
        monthInput = monthScan.nextInt();
     } else {
       String dummy = monthScan.next();
       monthInput = 0;
    }
}

you can check like this

System.out.print("Enter month (valid values are from 1 to 12): ");
Scanner monthScan = new Scanner(System.in);

while(monthScan.hasNext())
{
   if(!monthScan.hasNextInt() && (monthInput<1 ||  monthInput>12))
   {
       System.out.print("Invalid value! Enter month (valid values are from 1 to 12):"); 
       continue;
   }

   // If the month input is below 1 or greater than 12, prompt for another value
  int monthInput = monthScan.nextInt();
  //do your logic here   
  break;//use the break after logic 

}


Use break after your logic so that It will exit after valid input.

A small modification to your program solves the problem

 System.out.print("Enter month (valid values are from 1 to 12): ");
        Scanner monthScan = new Scanner(System.in);
       int monthInput = monthScan.nextInt();
        // If the month input is below 1 or greater than 12, prompt for another value
        while((monthInput<1 || monthInput>12) )
        {
            System.out.print("Invalid value! Enter month (valid values are from 1 to 12): ");

            monthInput = monthScan.nextInt();
        }
        System.out.println("I am here");

Output:

Enter month (valid values are from 1 to 12): -5
Invalid value! Enter month (valid values are from 1 to 12): -5
Invalid value! Enter month (valid values are from 1 to 12): -2
Invalid value! Enter month (valid values are from 1 to 12): 5
I am here

Hope this helps you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM