Рекурсивный метод с исключением, логической ошибкой

#java

#Ява

Вопрос:

Я пытаюсь создать код, который вставляет пользовательский ввод до тех пор, пока ввод не будет правильным (двойной), он будет повторяться до тех пор, пока ввод не будет правильным.

Ниже приведен код:

 private static double variableNumberInput(String variableName, Scanner userInput) {  double userInputNumber = 0;  try {  System.out.println(String.format("Input value: %s", variableName));  userInputNumber = Double.valueOf(userInput.nextLine());  } catch (Exception exception) {  System.out.println("Please try again");  variableNumberInput(variableName, userInput);  }  return userInputNumber; }  

Он работал идеально , как я и хотел…, пока я не протестировал его и сначала намеренно не вставил неправильный ввод (используя строку), после чего вставил правильный ввод. В результате он возвращает 0.

 "Input value: X" incorrect input "Please try again" "Input value: X" 1 returns -gt; 0  

Я попытался отладить его, и он, по-видимому, возвращает правильное значение, но каким-то образом после правильного ввода он снова вызывает метод внутри блока catch только для возврата 0.

Не могу понять, почему он так себя ведет, может кто-нибудь, пожалуйста, помочь мне понять?

Комментарии:

1. Исправлено: Измените строку на userInputNumber = variableNumberInput(variableName, userInput); .

2. Или просто return variableNumberInput(variableName, userInput);

3. Спасибо Йоханнескуну и Абре за помощь, это решило возвращаемое значение 🙂

Ответ №1:

Вы не сохраняете результат своих рекурсивных вызовов. Попробуйте это:

 private static double variableNumberInput(String variableName, Scanner userInput) {  double userInputNumber = 0;  try {  System.out.println(String.format("Input value: %s", variableName));  userInputNumber = Double.valueOf(userInput.nextLine());  } catch (Exception exception) {  System.out.println("Please try again");  userInputNumber = variableNumberInput(variableName, userInput);  }  return userInputNumber; }  

Обратите внимание на изменение в catch блоке.

Комментарии:

1. А-а-а, теперь я понимаю.. Так как он всегда будет возвращать 0, потому что он находится в предыдущем блоке catch.. спасибо за попытку переписать код и привести наглядный пример 🙂

Ответ №2:

Почему вы ожидали чего-то другого? Вы, вероятно, напечатаете результат самого первого вызова метода, и, поскольку он равен 0, это то, что он вернет.

Вместо этого вы должны возвращать любой результат, возвращенный рекурсивным вызовом.

Комментарии:

1. Я вижу, я не заметил, что, когда я делаю это в блоке catch, он всегда в конце концов вернется к нему снова.. Спасибо, что помогли мне понять мистера Плюту