Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
10 Июл 2023
2 мин
902

Проблема пропуска метода nextLine() после использования next() или nextFoo() в Java

В процессе работы с Java, особенно при использовании класса Scanner для чтения ввода, может возникнуть некоторая путаница. Одна из самых распространенных

В процессе работы с Java, особенно при использовании класса Scanner для чтения ввода, может возникнуть некоторая путаница. Одна из самых распространенных проблем заключается в том, что метод nextLine() кажется «пропускается» после использования других методов, таких как next() или nextFoo().

Пример такого кода:

System.out.println("Введите числовое значение");    
int option;
option = input.nextInt(); // Чтение числового значения из ввода
System.out.println("Введите первую строку"); 
String string1 = input.nextLine(); // Чтение первой строки (кажется, что пропускается)
System.out.println("Введите вторую строку");
String string2 = input.nextLine(); // Чтение второй строки (появляется сразу после чтения числового значения)

В этом примере, после ввода числового значения, программа кажется пропускает запрос на ввод первой строки и сразу переходит к запросу на ввод второй строки.

Введите числовое значение
3   // Это мой ввод
Введите первую строку    // Программа должна остановиться здесь и ждать моего ввода, но она пропускает этот этап
Введите вторую строку    // ...и эта строка выполняется и ждет моего ввода

Это происходит из-за того, как работает сканер. Когда вы используете методы next() или nextFoo(), сканер читает ввод до тех пор, пока не встречает пробел (или любой другой разделитель, заданный по умолчанию). Однако он оставляет символ новой строки (enter) в буфере ввода.

Затем, когда вы вызываете метод nextLine(), он читает и возвращает все символы до следующего символа новой строки… который уже находится в буфере ввода! Поэтому кажется, что nextLine() пропускается — он просто сразу же встречает символ новой строки и завершает свою работу.

Чтобы решить эту проблему, вы можете просто добавить дополнительный вызов nextLine() после next() или nextFoo(). Это «очистит» символ новой строки из буфера ввода, позволяя следующему вызову nextLine() работать правильно.

System.out.println("Введите числовое значение");    
int option;
option = input.nextInt(); // Чтение числового значения из ввода
input.nextLine(); // Очистка буфера ввода
System.out.println("Введите первую строку"); 
String string1 = input.nextLine(); // Теперь это работает правильно!
System.out.println("Введите вторую строку");
String string2 = input.nextLine(); 

Теперь все работает так, как и ожидалось!

Опрос для читателей: Какой язык программирования лучше? Узнайте результат после голосования

Добавить комментарий