2017-02-16 47 views
0

Я пишу код 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; 
    } 
} 

Например, если два класса выше, я хочу следующее произойдет:

  1. Метод askUserForFavorite выполняется.
  2. Пользователь вводит «Картофель», когда запрашивается их первый любимый номер. Таким образом возникает исключение NumberFormatException.
  3. «ОШИБКА: неверный ввод! Введите целое число». печатается на консоли .
  4. askUserForFavorite метод выполняется (снова). Это то, с чем я борюсь.
  5. Пользователь вводит «2» при запросе на любимый номер. Таким образом, исключение не возникает.

После выполнения некоторых исследований, я вижу, что многие люди идут с Strategy Design Pattern, однако, что не устраивает меня хорошо, потому что у меня есть динамические переменные в своих методах CLASSA и интерфейсы не очень хорошо играть с динамическими переменными.

В других случаях некоторые разработчики передают параметр «Callable < MethodReturnType>» в их эквивалент моего метода getIntFromConsole и вызывают метод будущего, который отражает переданный метод. Этот подход кажется, что он будет работать, но для этого требуется добавить новый слой абстракции.

Есть ли способ, которым я могу просто вызвать предыдущий метод из класса А, который вызвал мой метод getIntFromConsole, без добавления слоя абстракции или интерфейса?

+0

использовать время цикла (т.е. 'в то время как (недействительный) {askForIt}') –

+0

Вы можете сделать '' getIntFromConsole' бросить NumberFormatException' дальше (возможно, обернув его в лучшее «подобрать« Исключение »), перехватить его в« main »и затем повторить попытку (например, используя цикл). – yeputons

ответ

2

Просто измените его петли

public static int getIntFromConsole() 
{ 
    Scanner scanner = new Scanner(System.in) 
    int value; 

    while (true) { 
     try 
     { 
      value = Integer.valueOf(scanner.nextLine()); 
      break; 
     } 
     catch (NumberFormatException e) 
     { 
     System.out.println("ERROR: Invalid input! Please enter a whole number."); 
     } 
    } 
    return value; 
} 
+0

Логично, этот подход кажется звуковым ... Позвольте мне попробовать его в моем фактическом коде (не глупый пример, который я включил в вопрос), и посмотреть, как это работает. Если это сработает, я приму этот ответ. Независимо от того, спасибо за ваше решение. –

+0

Я сильный сторонник KISS –

+0

Отлично работает! Еще раз спасибо ... Ответ принят! –

 Смежные вопросы

  • Нет связанных вопросов^_^