Использование scanner.nextLine()
У меня возникли проблемы при попытке использовать метод nextLine() из java.util.Scanner.
Вот что я пробовал:
import java.util.Scanner;
class TestRevised {
public void menu() {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter a sentence:\t");
String sentence = scanner.nextLine();
System.out.print("Enter an index:\t");
int index = scanner.nextInt();
System.out.println("\nYour sentence:\t" + sentence);
System.out.println("Your index:\t" + index);
}
}
Пример # 1: Этот пример работает по назначению. Строка String sentence = scanner.nextLine();
ожидает ввода ввода перед продолжением System.out.print("Enter an index:\t");
.
Это приводит к выходу:
Enter a sentence: Hello.
Enter an index: 0
Your sentence: Hello.
Your index: 0
// Example #2
import java.util.Scanner;
class Test {
public void menu() {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("\nMenu Options\n");
System.out.println("(1) - do this");
System.out.println("(2) - quit");
System.out.print("Please enter your selection:\t");
int selection = scanner.nextInt();
if (selection == 1) {
System.out.print("Enter a sentence:\t");
String sentence = scanner.nextLine();
System.out.print("Enter an index:\t");
int index = scanner.nextInt();
System.out.println("\nYour sentence:\t" + sentence);
System.out.println("Your index:\t" + index);
}
else if (selection == 2) {
break;
}
}
}
}
Пример # 2: Этот пример не работает должным образом. В этом примере используется цикл while и if - else, позволяющий пользователю выбирать, что делать. Как только программа дойдет до String sentence = scanner.nextLine();
, она не ждет ввода, а вместо этого выполняет строку System.out.print("Enter an index:\t");
.
Это приводит к выходу:
Menu Options
(1) - do this
(2) - quit
Please enter your selection: 1
Enter a sentence: Enter an index:
Это делает невозможным ввод предложения.
Почему пример №2 не работает так, как предполагалось? Единственное различие между Исх. 1 и 2 - это пример. 2 имеет цикл while и структуру if-else. Я не понимаю, почему это влияет на поведение сканера .nextInt().
Ответы
Ответ 1
Я думаю, ваша проблема в том, что
int selection = scanner.nextInt();
читает только номер, а не конец строки или что-либо после номера. Когда вы объявляете
String sentence = scanner.nextLine();
Это считывает оставшуюся часть строки с номером на ней (ничто после числа, которое я подозреваю)
Попробуйте поместить сканер .nextLine(); после каждого nextInt(), если вы намерены игнорировать остальную часть строки.
Ответ 2
Вместо того, чтобы размещать дополнительный scanner.nextLine()
каждый раз, когда вы хотите что-то прочитать, так как кажется, что вы хотите принять каждый ввод в новой строке, вы можете вместо этого изменить разделитель, чтобы фактически соответствовать только символам новой строки (вместо любых пробел, как и по умолчанию)
import java.util.Scanner;
class ScannerTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\\n");
System.out.print("Enter an index: ");
int index = scanner.nextInt();
System.out.print("Enter a sentence: ");
String sentence = scanner.next();
System.out.println("\nYour sentence: " + sentence);
System.out.println("Your index: " + index);
}
}
Таким образом, чтобы прочитать строку ввода, вам нужен только scanner.next()
, который имеет одинаковое поведение с разделителем следующего {Int, Double,...}
Разница с подходом nextLine() каждый раз заключается в том, что последний будет принимать в качестве индекса также <space>3
, 3<space>
и 3<space>whatever
, в то время как первый принимает только 3
в строке на его собственный
Ответ 3
Не пытайтесь сканировать текст с помощью nextLine(); ПОСЛЕ использования nextInt() с тем же сканером! Это не очень хорошо работает с Java Scanner, и многие разработчики Java предпочитают использовать другой сканер для целых чисел. Вы можете вызвать эти сканеры scan1 и scan2, если хотите.
Ответ 4
Это потому, что, когда вы вводите число, затем нажмите Enter, input.nextInt()
потребляет только номер, а не "конец строки" . Примитивные типы данных, такие как int, double и т.д., Не потребляют "конец строки" , поэтому "конец строки" остается в буфере, а когда input.next()
выполняется, он потребляет "конец строки" из буфера с первого входа. Поэтому ваш String sentence = scanner.next()
потребляет только "конец строки" и не ждет, чтобы читать с клавиатуры.
Совет: используйте scanner.nextLine()
вместо scanner.next()
, потому что scanner.next()
не читает пробелы с клавиатуры. (Усечь строку после предоставления некоторого пространства с клавиатуры, только показать строку перед пробелом.)
Ответ 5
или
int selection = Integer.parseInt(scanner.nextLine());