Использование 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, если хотите.

Или же

int selection = Integer.parseInt(scanner.nextLine());
Другие вопросы по тегам