Как работает рекурсия в консольном калькуляторе?
Не могу понять, правильно ли я понял рекурсию в консольном калькуляторе.
Есть такой код
public static int getInt(){
System.out.println("Введите число:");
int num;
if(scanner.hasNextInt()){
num = scanner.nextInt();
} else {
System.out.println("Вы допустили ошибку при вводе числа. Попробуйте еще раз.");
scanner.next();//рекурсия
num = getInt();
}
return num;
}
Но если убрать кусок кода "scanner.next();" то бесконечно будет печатать "Введите число:" "Вы допустили ошибку при вводе числа. Попробуйте еще раз."
А если сделать так
public static int getInt(){
System.out.println("Введите число:");
int num;
if(scanner.hasNextInt()){
num = scanner.nextInt();
} else {
System.out.println("Вы допустили ошибку при вводе числа. Попробуйте еще раз.");
String ggg = scanner.nextLine();
System.out.println("Ви ввели не число, ви ввели" + " " + ggg);
num = getInt();
}
return num;
}
То напечатает то что я ввел. Я правильно понимаю что Scanner уже сохранил то что я ввел первый раз и с ним надо что то сделать, как-то обнулить?
Ответы (2 шт):
scanner.hasNextInt() только проверяет, является ли текущее введенное значение целым числом. То есть после этой функции на входе сканера по прежнему введенное значение. Если целое - то идет вызов scanner.nextInt(); оно считывает число и переводит сканер к вводу следующего значения, если не целое то иначе в блок else. scanner.next() это не рекурсия. Это считывание данных сканера до следующего символа разделителя(по умолчанию пробел) и переводит указателя(условно) сканера к следующему вводимому значению. Рекурсия у вас в строке num = getInt(); (то есть вызов функции самой себя) Логично, если убрать scanner.next(), то сканер по прежнему будет иметь на входе ваши первоначально введенные данные и будет бесконечно вызывать getInt() с одним и тем-же результатом.
Я правильно понимаю что Scanner уже сохранил то что я ввел первый раз и с ним надо что то сделать, как-то обнулить?
Примерно так. В ваших примерах scanner.next() и scanner.nextLine() возвращают введенные значения сканера и переводят его к готовности вводить следующее значение.
Условный оператор if выдвигает условие: scanner.hasNextInt() - нужно целое число. num = scanner.nextInt() - Если вводится целое число то оно присваивается "num" и уходит в команду return num; в методе getInt();. Команда return num; отправляет целое число в метод main(), в переменные int num1 = getInt(); и int num2 = getInt(); Если не целое число введено, то такой ввод идёт в тело else { ...}. И в этом теле метод scanner.next(); принимает этот ввод и хоронит его, т.е. никуда не отправляет и никому не присваивает. Следующая команда, рекурсия num = getInt(); отправляет программу в начало своего же метода getInt(); и опять предлагает ввести целое число. Так она, рекурсия работает, пока не введёте целое число и не перепрыгнете else { ...}, рекурсия будет отправлять программу в начало своего же метода. Введёте целое число, перепрыгнете else { ...}, и отправите число в main().