Tymu888
Tymu888

Reputation: 27

How to go back to the "try" code everytime the input is not correct (in Java)?

I want the program to retry the "try" part of the code every time the input is incorrect and throws an error(which is solved with an exception).

My code looks like this:

try {
    System.out.print("Enter a number from 1 to 3: ");
    enteredNumber = userInputScanner.nextInt();
    makeHumanMove(enteredNumber);
}catch(Exception e){
    System.out.println("Incorrect input!");

My "makeHumanMove" function checks, if the number is from 1 to 3.. But if the user inserts a letter, it would throw an error and if it happens, I want the program to ask for another input until the user inserts a correct input.

I've tried while and for loops but I keep messing up. Any ideas?

Upvotes: 1

Views: 115

Answers (3)

Kirill K
Kirill K

Reputation: 781

How's about this code:

while (true) {
try {
    System.out.print("Enter a number from 1 to 3: ");
    enteredNumber = userInputScanner.nextInt();
    makeHumanMove(enteredNumber);
    break;
}catch(Exception e){
    System.out.println("Incorrect input!");
}
}

Make sure that your makeHumanMove(enteredNumber); throws new Exception();

Upvotes: 1

Maarten Bodewes
Maarten Bodewes

Reputation: 93968

Use a boolean value outside, set it to true at the end of the try block. Then you can test for it using a while loop.

int enteredNumber;
boolean correctNumber = false;
while (!correctNumber) {
    try {
        System.out.print("Enter a number from 1 to 3: ");
        enteredNumber = userInputScanner.nextInt();
        makeHumanMove(enteredNumber);
        correctNumber = true;
    }catch(Exception e){
        System.out.println("Incorrect input!");
    }
}

Note that you should not use exceptions at all to report incorrect input. You should test for incorrect input and abort early. You should also consider if makeHumanMove should actually be part of the try/catch block; input validation should not be part of the business logic of your application.

final int number;
System.out.print("Enter a number from 1 to 3: ");
while (true) {
    int enteredNumber;
        try {
            enteredNumber = userInputScanner.nextInt();
        } catch (Exception e) {
            System.out.print("Not a number, enter a number from 1 to 3: ");
            userInputScanner = new Scanner(System.in);
            continue;
        }
    if (enteredNumber < 1 || enteredNumber > 3) {
        System.out.print("Incorrect number, enter a number from 1 to 3: ");
        continue;
    } else {
        number = enteredNumber;
        break;
    }
}
makeHumanMove(number);

Upvotes: 0

DaveH
DaveH

Reputation: 7335

boolean inputIsCorrect = false;
while(inputIsCorrect == false){
try {
    System.out.print("Enter a number from 1 to 3: ");
    enteredNumber = userInputScanner.nextInt();
    makeHumanMove(enteredNumber);
    inputIsCorrect = true;
}catch(Exception e){
    System.out.println("Incorrect input!");
}
}

This, of course, assumes that your makeHumanMove method throws an exception.

If I was doing this, I don't think I would be using exceptions. My code would be more like ...

boolean inputIsCorrect = false;
while(inputIsCorrect == false){

    System.out.print("Enter a number from 1 to 3: ");
    enteredNumber = userInputScanner.nextInt();
    inputIsCorrect = makeHumanMove(enteredNumber);
}

I'd change the makeHumanMove return a value that indicates whether the the inout is valid or not, rather than using exceptions. ( Can't remember if scanner.nextInt() throws exception .... )

Upvotes: 0

Related Questions