user8964654
user8964654

Reputation: 97

How to repeat a question to a user until while loop condition is false?

I'm bulding a console application where I am trying to force a user to enter an int as a possible answer to a question otherwise the same question is repeated to the user.Thus, the user cannot move on without entering the proper data type.

below is my sample code.

Scanner scanner = new Scanner(System.in);
int userInput = 0;
do {
       AskQuestion();
       if(scanner.hasNextInt()) {
          userInput = scanner.nextInt();
    }
}
while(!scanner.hasNextInt()) ;

While I know this can be done in C#, I'm not exactly sure how to do it in java without getting stuck in an infinite loop. How do I get my code to do what I want to do? Please help!

Upvotes: 0

Views: 1022

Answers (5)

Fermat
Fermat

Reputation: 1

My solution might be a bit bloated, but I hope it's nice and clear what's going on. Please do let me know how it can be simplified!

import java.util.Scanner;  // Import the Scanner class

class Main {public static void main(String[] args) {

    Scanner myObj = new Scanner(System.in);  // Create a Scanner object
    String unit;

    // unit selector
    while (true) {
        System.out.println("Did you measure ion feet or meters? Type 'meters' or 'feet': ");
        String isUnit = myObj.nextLine();
        if (isUnit.equals("feet") || (isUnit.equals("meters"))) {
            unit = isUnit;
            break;
        } else {
            System.out.println("Please enter either 'meters' or 'feet'.");
        }
    }

    System.out.println("Use selected " + unit);

}

Upvotes: 0

Abhinav Chauhan
Abhinav Chauhan

Reputation: 1384

This is nice and short one

Scanner scanner = new Scanner(System.in);
do askQuestion();
while(!scanner.nextLine().trim().matches("[\\d]+"));

Tell me if you like it

Note it just tell you if number was an int , and keeps repeating if not, but doesn't give you that int back , tell me if you need that, i shall find a way

Upvotes: 1

DevilsHnd - 退した
DevilsHnd - 退した

Reputation: 9192

Another alternative which utilizes the Scanner#nextLine() method along with the String#matches() method and a small Regular Expression (RegEx) to ensure that the supplied string does indeed contain all numerical digits:

Scanner scanner = new Scanner(System.in);
String userInput = "";
int desiredINT = 0;  // Default value.
while (desiredINT == 0) {
    AskQuestion();
    userInput = scanner.nextLine();
    if (userInput.matches("\\d+")) {
        desiredINT = Integer.parseInt(userInput);
        if (desiredINT < 1 || desiredINT > 120) {
            System.out.println("Invalid Input! The age supplied is not "
                             + "likely! Enter a valid Age!");
            desiredINT = 0;
        }
    } 
    else {
        System.out.println("Invalid Input! You must supply an Integer "
                         + "value! Try Again...");
    }
} 
System.out.println("Your age is: --> " + desiredINT);

And the AskQuestion() method:

private void AskQuestion() {
    System.out.println("How old are you?");
}

Upvotes: 2

cybersam
cybersam

Reputation: 67019

Try this:

Scanner scanner = new Scanner(System.in);
int userInput;
while(true) {
    AskQuestion();
    if (scanner.hasNextInt()) {
        userInput = scanner.nextInt();
        break;
    }
    scanner.next(); // consume non-int token
}

Upvotes: 2

Bruno Gava Guerra
Bruno Gava Guerra

Reputation: 101

You can use something like this. It'a a pretty simple flag combined with the use of the Scanner class.

    boolean flag = false;
    int val = 0;
    while(!flag){
        System.out.println("Something");
        if(sc.hasNext()){
            if(sc.hasNextInt()){
                val = sc.nextInt();
                flag = true;
            }
            else{
                sc.next();
            }
        }
    }

Upvotes: 2

Related Questions