I am writing some Java code where I want to loop back to the earlier method, if an exception is found.
Here is a simplified version of my code:
public class classA
{
public static void main(String[] args)
{
int number1 = askUserForFavoriteSum();
int number2 = askUserForAnotherNumber();
}
public static int askUserForFavoriteSum()
{
int firstFavorite;
int secondFavorite;
int favoriteSum
System.out.println("What is your first favorite number?");
firstFavorite = classB.getIntFromConsole();
System.out.println("What is your second favorite number?");
secondFavorite = classB.getIntFromConsole();
favoriteSum = firstFavorite + secondFavorite;
return favoriteSum;
}
public static int askUserForAnotherNumber()
{
int number;
System.out.println("What is another number?");
number = classB.getIntFromConsole();
return number;
}
}
public class classB
{
public static int getIntFromConsole()
{
Scanner scanner = new Scanner(System.in)
int value;
try
{
value = Integer.valueOf(scanner.nextLine());
}
catch (NumberFormatException e) //Occurs when the input string cannot cleanly be converted to an int.
{
System.out.println("ERROR: Invalid input! Please enter a whole number.");
}
return value;
}
}
For example, given the two classes above, I want the following to happen:
- askUserForFavorite method is executed.
- User enters "Potatoe" when prompted for their first favorite number. As such, a NumberFormatException occurs.
- "ERROR: Invalid input! Please enter a whole number." is printed to the console.
- askUserForFavorite method is executed (again). This is what I am struggling with.
- User enters "2" when prompted for favorite number. As such, no exception occurs.
After doing some research, I see that many people go with the Strategy Design Pattern, however, that doesn't suit me well because I have dynamic variables in my classA methods and interfaces don't play well with dynamic variables.
In other cases, some developers pass a "Callable < MethodReturnType >" parameter into their equivalent of my "getIntFromConsole" method and call a future method that mirrors the passed-in method. This approach seems like it would work, but it requires me to add a new layer of abstraction.
Is there a way in which I can simply call the previous method from classA that called my getIntFromConsole method, without adding a layer of abstraction or an interface?