Простой Java-код, который плохо работает

#java

#java

Вопрос:

Следующий простой код на Java ведет себя несколько странным образом, который я не могу понять.

 final public class Main
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.print("nHow many names?   ");

        int n = sc.nextInt();
        String[] a = new String[n];

        a[0] = sc.nextLine(); //This line serves no purpose at all. It's useless and should be removed.

        for (int i=0; i<n; i  )
        {
            System.out.print("nEnter the name:->");
            a[i] = sc.nextLine(); //request for input only inside the loop.
        }

        for (int i=0; i<a.length; i  )
        {
            System.out.println(a[i]);
        }
    }
}
  

Приведенный выше код работает хорошо без каких-либо проблем и отображает количество имен, введенных в массив a [] на консоли, но когда я удаляю строку a[0] = sc.nextLine(); //Эта строка вообще не служит никакой цели. Это бесполезно и должно быть удалено. Сначала он отображается для количества пользователей. допустим, 3. проблем нет, но когда цикл начнет повторяться, он запросит имя, и в первый раз сообщение Введите имя:-> отображается дважды


и результат будет примерно таким, как показано ниже.

Сколько имен? 3

Введите имя:-> Don't allow to enter the name here.

Введите имя:-> Tiger

Введите имя:-> Питтер

Тигр

Pitter


Хотя я ввел 3 для «Сколько имен?», он позволяет вводить только два имени. Почему?


Еще раз обратите внимание, что приведенный выше код работает хорошо. Проблема возникает только тогда, когда строка, выделенная жирным шрифтом в последнем абзаце выше, закомментирована.

Комментарии:

1. «Происходит что-то неизвестное» — не самый полезный заголовок вопроса; возможно, вы могли бы отредактировать его, чтобы он был более конкретным…

Ответ №1:

Когда вы используете Scanner.nextInt() , он сам не использует новую строку (или другой разделитель), поэтому следующий возвращаемый токен обычно будет пустой строкой. Таким образом, вам нужно следовать за ним с Scanner.nextLine() . Вы можете отменить результат вместо того, чтобы назначать его a[0] :

 int n = sc.nextInt(); 
sc.nextLine();
  

Именно по этой причине я предлагаю всегда использовать nextLine (или BufferedReader.readLine() ) и выполнять синтаксический анализ после использования Integer.parseInt() .

Ответ №2:

Вы читаете три строки. Проблема в том, что nextInt() считывает значение int, но не считывает и не использует конец строки. (Распространенная ошибка)

Вам нужна следующая строка() после нее, чтобы сказать, что вы хотите игнорировать остальную часть строки.

Ответ №3:

nextInt Вызов считывает входные данные до конца int, но не считывает символ новой строки после int. Итак, на первой итерации отображается «введите имя», затем вызывается nextLine() , который считывает конец строки, где вы ввели количество игроков (пустая строка). Затем запускается вторая итерация и отображает «введите имя» и nextLine() блокируется до тех пор, пока вы не введете символ новой строки.