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