#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, он всегда в конце концов вернется к нему снова.. Спасибо, что помогли мне понять мистера Плюту