Я пишу код Java, где я хочу вернуться к более раннему методу, если обнаружено исключение.Java: как вызвать предыдущий метод после исключения глотания
Вот упрощенная версия моего кода:
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;
}
}
Например, если два класса выше, я хочу следующее произойдет:
- Метод askUserForFavorite выполняется.
- Пользователь вводит «Картофель», когда запрашивается их первый любимый номер. Таким образом возникает исключение NumberFormatException.
- «ОШИБКА: неверный ввод! Введите целое число». печатается на консоли .
- askUserForFavorite метод выполняется (снова). Это то, с чем я борюсь.
- Пользователь вводит «2» при запросе на любимый номер. Таким образом, исключение не возникает.
После выполнения некоторых исследований, я вижу, что многие люди идут с Strategy Design Pattern, однако, что не устраивает меня хорошо, потому что у меня есть динамические переменные в своих методах CLASSA и интерфейсы не очень хорошо играть с динамическими переменными.
В других случаях некоторые разработчики передают параметр «Callable < MethodReturnType>» в их эквивалент моего метода getIntFromConsole и вызывают метод будущего, который отражает переданный метод. Этот подход кажется, что он будет работать, но для этого требуется добавить новый слой абстракции.
Есть ли способ, которым я могу просто вызвать предыдущий метод из класса А, который вызвал мой метод getIntFromConsole, без добавления слоя абстракции или интерфейса?
использовать время цикла (т.е. 'в то время как (недействительный) {askForIt}') –
Вы можете сделать '' getIntFromConsole' бросить NumberFormatException' дальше (возможно, обернув его в лучшее «подобрать« Исключение »), перехватить его в« main »и затем повторить попытку (например, используя цикл). – yeputons