У меня возникли проблемы при попытке использовать метод 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("Введите индекс:\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("Введите индекс:\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. Я не понимаю, почему это влияет на поведение scanner.nextInt().
Я думаю, ваша проблема в том, что
int selection = scanner.nextInt();
считывает только номер, а не конец строки или что-либо после номера. Когда вы объявляете
String sentence = scanner.nextLine();
читается остаток строки с числом (подозреваю, что после числа ничего нет).
Попробуйте поместить scanner.nextLine(); после каждого nextInt(), если вы собираетесь игнорировать оставшуюся часть строки.
Вместо того чтобы размещать дополнительный 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()
, который имеет такое же поведение с точки зрения разделителя, как и next{Int, Double, ...}
Разница с подходом "nextLine() every time" заключается в том, что последний будет принимать в качестве индекса также <space>3
, 3<space>
и 3<space>whatever
, в то время как первый принимает только 3
в строке сам по себе
Это потому, что когда вы вводите число, затем нажимаете Enter, input.nextInt ()
потребляет только число, а не «конец строки». Примитивные типы данных, такие как int, double и т. Д., Не используют «конец строки», поэтому «конец строки» остается в буфере, а когда input.next ()
выполняется, он потребляет «конец строки» из буфера из первый вход. Вот почему ваше String предложение = scanner.next ()
потребляет только «конец строки» и не ждет чтения с клавиатуры.
Совет: используйте scanner.nextLine ()
вместо scanner.next ()
, потому что scanner.next ()
не читает пробелы с клавиатуры. (Усечь строку после выделения некоторого пространства с клавиатуры, только показать строку перед пробелом.)
Не пытайтесь сканировать текст с помощью nextLine (); ПОСЛЕ использования nextInt () с тем же сканером! Он плохо работает со Java Scanner, и многие разработчики Java предпочитают просто использовать другой сканер для целых чисел. Вы можете вызвать эти сканеры scan1 и scan2, если хотите.
или
int selection = Integer.parseInt(scanner.nextLine());