Использование 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());