Почему мне нужно дважды очищать буфер для получения правильного вывода?

Я только вчера начал изучать Java, а сегодня изучал ввод данных. Я узнал, почему нам нужно очищать буфер сканера перед вводом данных с помощью .nextLine() после использования .nextInt(), но я заметил одну вещь, если я удаляю оператор печати непосредственно перед вводом данных из .nextLine(). Мне пришлось использовать .nextLine() дважды вместо одного раза, чтобы удалить буфер, иначе он не работал должным образом.

Мой исходный код был таким:

Scanner sc = new Scanner(System.in);
System.out.println("Enter the number :");
int num = sc.nextInt();
sc.nextLine();
System.out.println("Enter the string :");
String str = sc.nextLine();
System.out.println(num);
System.out.println(str);

Итак, если я удаляю оператор печати непосредственно перед тем, как взять входную строку и сохранить ее в переменной str, он снова передаст значение \n этой переменной, хотя ранее я удалил буфер с помощью .nextLine().

Текущий код:

Scanner sc = new Scanner(System.in);
System.out.println("Enter the number :");
int num = sc.nextInt();
sc.nextLine();
sc.nextLine();
String str = sc.nextLine();
System.out.println(num);
System.out.println(str);

В идеале оператор печати не должен влиять на буфер сканера, верно? Так почему пропускает?

Кроме того, поскольку я уже удалил буфер, то почему он снова передает значение \n в мою переменную str, если я либо не удалю буфер два раза, либо не передам оператор печати перед вводом данных.

Я пытался найти его в Google и пытался много искать на YouTube и здесь, но ни одно из решений на самом деле не обсуждало эту проблему, с которой я сталкиваюсь прямо сейчас.

Отвечает ли это на ваш вопрос? Сканер пропускает nextLine() после использования next() или nextFoo()?

Franck 14.05.2022 22:38

@Franck Извини, брат, но это не так, может быть, я не смог хорошо сформулировать свои вопросы. На самом деле мой вопрос заключался в том, что мне пришлось очищать буфер два раза вместо одного, если я удалю оператор println. Хотя этот оператор println не должен влиять на буфер сканера, так почему же это происходит?

Rohit 14.05.2022 22:43

Я не могу воспроизвести вашу проблему: если я использую три nextLine(), вторая строка ввода отбрасывается (как и ожидалось) - если я использую два, вторая строка ввода печатается (после печати числа)

user16320675 14.05.2022 22:58

На самом деле я скопировал его и запустил. Результаты довольно интересны, потому что я не сталкивался с проблемой, с которой столкнулись вы. Когда я очищаю его один раз, я получаю правильный результат, а если я делаю это дважды, я получаю ошибку (нет такого исключения элемента, потому что он не находит никаких входных данных). Проблема может быть из-за того, что проект не перестроен или что-то в этом роде.

wolfenblut 14.05.2022 22:58

Кстати, может быть и из-за копипаста. В прошлом я столкнулся с похожей проблемой. Если вы скопируете и вставите текст с символом новой строки ('\n') в конце, он добавит еще один '\n' в конец, и у вас будет двойное значение этого символа ("\n\n"), что может вызвать это. проверьте и это.

wolfenblut 14.05.2022 23:01

@wolfenblut да, я думаю, что есть проблема с моей IDE, потому что при онлайн-компиляции она фактически печатает правильный результат. Приносим извинения за доставленные неудобства.

Rohit 14.05.2022 23:05

@Rohit Тогда не могли бы вы отметить мое решение ниже как ответ? Это было бы полезно для других, имеющих аналогичные проблемы.

wolfenblut 14.05.2022 23:18

@wolfenblut Да, я буду, но не могли бы вы проверить эту мою короткую запись. Я думаю, тогда вы действительно могли бы найти, в чем проблема с моей IDE. Извините, еще раз за неудобства. Перекодирование: drive.google.com/file/d/1h7C_MdkMxE7nW9J747gO2gHV2u38r6kH/…

Rohit 14.05.2022 23:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Дело не в операторах печати или «буфере».

Видите ли, метод nextInt() оставляет после себя символ новой строки, то есть \n, висящий на входе.
Таким образом, предстоящий метод nextLine() выбирает этот \n в качестве входных данных, и поэтому вам нужно добавить еще один nextLine() для захвата фактического ввода строки.

Решение:
Вместо, Используйте Integer.parseInt(sc.nextLine()) для получения значений int и используйте обычный sc.nextLine() для получения строковых входных данных.

Или добавьте nextLine(), чтобы использовать этот дополнительный \n перед nextLine(), чтобы получить фактический ввод.

Вопросы спрашивает, почему два раза вместо одного.

wolfenblut 14.05.2022 22:55

Спасибо за предложение. Надеюсь, я вас понял. Итак, вы предлагаете это, не так ли? Сканер sc = новый сканер (System.in); int num = Integer.parseInt(sc.nextLine()); Строка ул = sc.nextLine(); System.out.println (число); Система.out.println(строка); Ввод был - 12 эй Ожидаемый результат был - 12 эй Но я все еще получаю это - 12 (пустое место)

Rohit 14.05.2022 22:56

@Rohit, как вы вводите данные? Прямо «12 эй» или 12 -> нажмите Enter -> эй?

Prasad Tamgale 14.05.2022 22:58

@PrasadTamgale Я ввожу ввод как 12 -> нажмите Enter -> эй

Rohit 14.05.2022 23:00

@Rohit Вы получаете строку в виде строки. Затем вы конвертируете его с помощью метода Integer.parseInt(String).

wolfenblut 14.05.2022 23:04

Как вы теперь знаете, какова роль дополнительной строки nextLine(), мы можем закрыть вопрос, верно?

Prasad Tamgale 14.05.2022 23:07
Ответ принят как подходящий

Это полностью интерпретационная ошибка, допущенная при вводе данных.

Пока вы запускаете свой код, вы запускаете его в своей любимой среде IDE. Один из вас (вы или IDE) непреднамеренно добавляет еще один символ '\n' в конец в соответствии с местом вашего курсора на консоли. Это заставляет сканер читать это как другую строку. Вы также можете перемещать курсор с помощью клавиш со стрелками (вверх, вниз, влево, вправо) на клавиатуре.

Хорошо, но почему System.out.println(); решает проблему?

Потому что он перемещает ваш курсор в нужное место.

Используйте другую IDE, и вы увидите, что этой проблемы не будет.

Большое тебе спасибо!!!! Это решило мою проблему. Первоначально я использовал IntelliJ по чьей-то рекомендации, но когда я переключился на VS Code после вашей рекомендации, проблема была исправлена. Еще раз большое спасибо, вы только что решили мою головную боль, которая не давала мне покоя последние 4 часа.

Rohit 14.05.2022 23:40

Вот почему Сколько терпения требуется программисту? — это часто задаваемые вопросы :)

wolfenblut 14.05.2022 23:44

Правда, кстати, спасибо, что поделились этим xD

Rohit 14.05.2022 23:56

Другие вопросы по теме