Господа, есть два стула…, ой т. е. кода. Логика в них примерно одна и та же, но второй работает как по мне странно. А именно:
В первом случае мы присваиваем переменной x произвольное число через метод console.nextInt(), который его считывает до первого "попавшегося на пути" символа переноса строки "\n" (нажатие ENTER после ввода числа). Считал число, присвоил переменной, но в сканере console всё ещё остаётся символ переноса строки "\n", который тянется дальше по программе. И, если после инициализации переменной x не вызвать метод console.nextLine() (который как раз таки скипнет этот самый оставшийся "\n") и написать вместо числа какое-нибудь слово, то условие следующего цикла while (!console.hasNextInt()) [while ("пока там не int")] выдаст false дважды и соответственно фраза "Введите y: " также запринтится дважды. Почему?
Вот что будет в консоли в начале цикла: "\n";
далее мы пишем любое слово и жмём Enter;
в консоли: "\n"слово"\n";
метод console.hasNextInt() -> false;
console.nextLine() скипает первый "\n" и на новый виток цикла уже поступает: слово"\n";
console.hasNextInt() -> false;
console.nextLine() скипает уже всю строку (слово"\n") и дальше всё работает в штатном режиме, без двойных принтов фразы "Введите y: " ведь в начале каждого последующего ввода у нас уже не будет незримо присутствовать "\n".
Избежать двойного принта в самом начале довольно просто. После инициализации переменной x просто вызвать "в холостую" console.nextLine() и всё; он скипнет этот несчастный "\n".
Суть самого цикла в общем-то заключается в том, чтобы пользователь обязательно ввёл целое число. Просто попробуйте запустить код с комментированным и не комментированным методом console.nextLine() после инициализации переменной x, и увидите разницу. Тесты должны быть одного вида:
1. какое-то число
2. какое-то слово
Что происходит в первом коде знаю я, знаете теперь и вы (или уже до этого знали эти нюансы). Однако второй код с той же логикой, но там я уже перехватываю исключение, не выдаст двойного принта не зависимо от того, вызову я после int x = console.nextInt(); console.nextLine(); или нет. Без разницы! Вообще.
Осюда вопрос: куда исчезает "\n" во втором коде?!
Asked
Active
Viewed 135 times
0
work8play
- 113
-
1Возможный дубликат вопроса: Особенности использования scanner.nextLine() – Алексей Шиманский Mar 12 '21 at 16:47
-
Перехват исключения вроде не при чём. Это работа nextInt такая. – Алексей Шиманский Mar 12 '21 at 16:48
1 Answers
1
Дело в том, что при вызове два раза подряд nexInt(), если мы ввели 2 числа (например, 1\n2\n), то первый перенос строки после второго nextInt() исчезнет (выражаясь вашими словами), а второй останется до будущих считываний.
-
Да, вы правы, но это происходит именно при вводе числа во второй разе. А если вылетает исключение? Т. е. пользователь сначала ввёл число, потом вводит чушь? И в консоли следующее: \nчушь\n. То когда это исключение срабатывает, в консоли остаётся: чушь\n Так? – work8play Mar 13 '21 at 06:47