Кажется, кроме повторного объявления переменной confirm
есть одна или несколько проблем -
Проблема 1:
После int age = userInput.nextInt()
.Он не будет запрашивать ввод страны и запросит Press Y to continue or N to start over
.
Причина этой проблемы:
Поскольку вы используете int age = userInput.nextInt();
, сканер примет толькоцелочисленное значение из ввода и пропустит символ новой строки \n
.
Исправление
В качестве обходного пути я добавил userInput.nextLine();
после int age = userInput.nextInt();
, так что он будет использовать символ \n
после nextInt()
.
Проблема 2:
После 1-й итерации эта строка вызовет ошибку confirm = userInput.next().charAt(0);
.
Причина этой проблемы:
В 2-й итерации вы не получите приглашение ввести имя в виде строки String name = userInput.nextLine();
примет \n
из последней итерации в качестве входных данных и пропустит и запросит возраст How old are you?
.
Fix
В качестве обходного пути я добавилuserInput.nextLine();
после confirm = userInput.next().charAt(0);
, так что после userInput.next().charAt(0)
он будет использовать символ \n
, и следующая итерация пойдет как положено.
Проблема 3:
Эта логика if (confirm !='y' || confirm !='n')
ожидает только y
и n
в lowercase
, но здесь while(confirm == 'Y'|| confirm == 'y')
вы ожидаете y
и Y
оба.
Исправление - я добавил необходимые изменения в приведенный ниже код, но рекомендовал бы изменить его на случай переключения.
ПРИМЕЧАНИЕ:
Не рекомендуется делать userInput.nextLine()
после каждого ввода, и вы можете просто разобрать его.См. здесь для получения дополнительной информации.
Я не рекомендую это, но это заставит вас работать с программой
Scanner userInput = new Scanner(System.in);
char confirm;
do {
System.out.println("Welcome to the story teller");
System.out.println("What is your name?");
String name = userInput.nextLine();
System.out.println("How old are you?");
int age = userInput.nextInt();
userInput.nextLine(); //adding this to retrieve the \n from nextint()
System.out.println("What country would you like to visit?");
String country = userInput.nextLine();
System.out.println("Great! So your name is " + name + ", you are " + age
+ "years old and you would like to visit " + country + " ?");
System.out.println("Press Y to continue or N to start over");
confirm = userInput.next().charAt(0);
userInput.nextLine(); //adding this to retrieve the \n this will help in next iteration
System.out.println(name + " landed in " + country + " at the age of " + age + ".");
if (confirm == 'y' || confirm == 'Y') {
continue; // keep executing, won't break the loop
} else if (confirm == 'n' || confirm == 'N') {
break; // breaks the loop and program exits.
} else {
System.out.println("Sorry that input is not valid, please try again");
// the program will exit
}
} while (confirm == 'Y' || confirm == 'y');
}
Рекомендую использовать регистр переключателей вместо сравнения if 1094, анализировать ввод символов и целых чисел и удалять произвольный userInput.nextLine()
, добавленный в качестве обходного пути.