Я только вчера начал изучать 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 и здесь, но ни одно из решений на самом деле не обсуждало эту проблему, с которой я сталкиваюсь прямо сейчас.
@Franck Извини, брат, но это не так, может быть, я не смог хорошо сформулировать свои вопросы. На самом деле мой вопрос заключался в том, что мне пришлось очищать буфер два раза вместо одного, если я удалю оператор println. Хотя этот оператор println не должен влиять на буфер сканера, так почему же это происходит?
Я не могу воспроизвести вашу проблему: если я использую три nextLine(), вторая строка ввода отбрасывается (как и ожидалось) - если я использую два, вторая строка ввода печатается (после печати числа)
На самом деле я скопировал его и запустил. Результаты довольно интересны, потому что я не сталкивался с проблемой, с которой столкнулись вы. Когда я очищаю его один раз, я получаю правильный результат, а если я делаю это дважды, я получаю ошибку (нет такого исключения элемента, потому что он не находит никаких входных данных). Проблема может быть из-за того, что проект не перестроен или что-то в этом роде.
Кстати, может быть и из-за копипаста. В прошлом я столкнулся с похожей проблемой. Если вы скопируете и вставите текст с символом новой строки ('\n') в конце, он добавит еще один '\n' в конец, и у вас будет двойное значение этого символа ("\n\n"), что может вызвать это. проверьте и это.
@wolfenblut да, я думаю, что есть проблема с моей IDE, потому что при онлайн-компиляции она фактически печатает правильный результат. Приносим извинения за доставленные неудобства.
@Rohit Тогда не могли бы вы отметить мое решение ниже как ответ? Это было бы полезно для других, имеющих аналогичные проблемы.
@wolfenblut Да, я буду, но не могли бы вы проверить эту мою короткую запись. Я думаю, тогда вы действительно могли бы найти, в чем проблема с моей IDE. Извините, еще раз за неудобства. Перекодирование: drive.google.com/file/d/1h7C_MdkMxE7nW9J747gO2gHV2u38r6kH/…




Дело не в операторах печати или «буфере».
Видите ли, метод nextInt() оставляет после себя символ новой строки, то есть \n, висящий на входе.
Таким образом, предстоящий метод nextLine() выбирает этот \n в качестве входных данных, и поэтому вам нужно добавить еще один nextLine() для захвата фактического ввода строки.
Решение:
Вместо,
Используйте Integer.parseInt(sc.nextLine()) для получения значений int и используйте обычный sc.nextLine() для получения строковых входных данных.
Или добавьте nextLine(), чтобы использовать этот дополнительный \n перед nextLine(), чтобы получить фактический ввод.
Вопросы спрашивает, почему два раза вместо одного.
Спасибо за предложение. Надеюсь, я вас понял. Итак, вы предлагаете это, не так ли? Сканер sc = новый сканер (System.in); int num = Integer.parseInt(sc.nextLine()); Строка ул = sc.nextLine(); System.out.println (число); Система.out.println(строка); Ввод был - 12 эй Ожидаемый результат был - 12 эй Но я все еще получаю это - 12 (пустое место)
@Rohit, как вы вводите данные? Прямо «12 эй» или 12 -> нажмите Enter -> эй?
@PrasadTamgale Я ввожу ввод как 12 -> нажмите Enter -> эй
@Rohit Вы получаете строку в виде строки. Затем вы конвертируете его с помощью метода Integer.parseInt(String).
Как вы теперь знаете, какова роль дополнительной строки nextLine(), мы можем закрыть вопрос, верно?
Это полностью интерпретационная ошибка, допущенная при вводе данных.
Пока вы запускаете свой код, вы запускаете его в своей любимой среде IDE. Один из вас (вы или IDE) непреднамеренно добавляет еще один символ '\n' в конец в соответствии с местом вашего курсора на консоли. Это заставляет сканер читать это как другую строку. Вы также можете перемещать курсор с помощью клавиш со стрелками (вверх, вниз, влево, вправо) на клавиатуре.
Хорошо, но почему System.out.println(); решает проблему?
Потому что он перемещает ваш курсор в нужное место.
Используйте другую IDE, и вы увидите, что этой проблемы не будет.
Большое тебе спасибо!!!! Это решило мою проблему. Первоначально я использовал IntelliJ по чьей-то рекомендации, но когда я переключился на VS Code после вашей рекомендации, проблема была исправлена. Еще раз большое спасибо, вы только что решили мою головную боль, которая не давала мне покоя последние 4 часа.
Вот почему Сколько терпения требуется программисту? — это часто задаваемые вопросы :)
Правда, кстати, спасибо, что поделились этим xD
Отвечает ли это на ваш вопрос? Сканер пропускает nextLine() после использования next() или nextFoo()?