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"); Stringstring1= input.nextLine(); // Read 1st string (this is skipped) System.out.println("Enter 2nd string"); Stringstring2= 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 используйте оставшуюся часть этой строки, включая перевод строки
Или, что еще лучше, прочитайте входные данные через Scanner.nextLine и преобразуйте свои входные данные в нужный вам формат. Например, вы можете преобразовать в целое число с помощью Integer.parseInt(String) метода.
Проблема в input.nextInt() методе; он считывает только значение int. Поэтому, когда вы продолжаете чтение с помощью input.nextLine(), вы получаете клавишу ввода "\n". Поэтому, чтобы пропустить это, вам нужно добавить input.nextLine().
Вместо этого попробуйте так:
System.out.print("Insert a number: "); intnumber= input.nextInt(); input.nextLine(); // This line you have to add (It consumes the \n character) System.out.print("Text1: "); Stringtext1= input.nextLine(); System.out.print("Text2: "); Stringtext2= 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