Вопрос-ответ

Scanner issue when using nextLine after nextXXX [duplicate]

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

Я использую Scanner методы nextInt() и nextLine() для чтения входных данных.

Это выглядит так:

System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string");
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)

Проблема в том, что после ввода числового значения первое input.nextLine() пропускается, а второе input.nextLine() выполняется, так что мой вывод выглядит следующим образом:

Enter numerical value
3 // This is my input
Enter 1st string // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string // ...and this line is executed and waits for my input

Я тестировал свое приложение, и похоже, что проблема заключается в использовании input.nextInt(). Если я удалю его, то оба string1 = input.nextLine() и string2 = input.nextLine() будут выполняться так, как я хочу.

Переведено автоматически
Ответ 1

Это потому, что Scanner.nextInt метод не считывает символ новой строки в ваших входных данных, созданных нажатием "Enter", и поэтому вызов Scanner.nextLine возвращается после чтения этой новой строки.

Вы столкнетесь с аналогичным поведением при использовании Scanner.nextLine after Scanner.next() или любого Scanner.nextFoo метода (кроме nextLine самого себя).

Обходной путь:


  • Либо ставьте Scanner.nextLine вызов после каждого Scanner.nextInt, либо Scanner.nextFoo используйте оставшуюся часть этой строки, включая перевод строки


    int option = input.nextInt();
    input.nextLine(); // Consume newline left-over
    String str1 = input.nextLine();

  • Или, что еще лучше, прочитайте входные данные через Scanner.nextLine и преобразуйте свои входные данные в нужный вам формат. Например, вы можете преобразовать в целое число с помощью Integer.parseInt(String) метода.


    int option = 0;
    try {
    option = Integer.parseInt(input.nextLine());
    } catch (NumberFormatException e) {
    e.printStackTrace();
    }
    String str1 = input.nextLine();

Ответ 2

Проблема в input.nextInt() методе; он считывает только значение int. Поэтому, когда вы продолжаете чтение с помощью input.nextLine(), вы получаете клавишу ввода "\n". Поэтому, чтобы пропустить это, вам нужно добавить input.nextLine().

Вместо этого попробуйте так:

System.out.print("Insert a number: ");
int number = input.nextInt();
input.nextLine(); // This line you have to add (It consumes the \n character)
System.out.print("Text1: ");
String text1 = input.nextLine();
System.out.print("Text2: ");
String text2 = input.nextLine();
Ответ 3

Это потому, что когда вы вводите число, а затем нажимаете Enter, input.nextInt() используется только число, а не "конец строки". При input.nextLine() выполнении он использует "конец строки", который все еще находится в буфере из первого ввода.

Вместо этого используйте input.nextLine() сразу после input.nextInt()

Ответ 4

Кажется, есть много вопросов по поводу этой проблемы с java.util.Scanner. Я думаю, что более читаемым / идиоматичным решением было бы вызвать scanner.skip("[\r\n]+") для удаления любых символов новой строки после вызова nextInt().

РЕДАКТИРОВАТЬ: как отметил @PatrickParker ниже, это вызовет бесконечный цикл, если пользователь введет какой-либо пробел после числа. Смотрите их ответ, чтобы узнать, какой шаблон лучше использовать с skip: https://javalang.ru/a/42471816/143585

java