#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()
блокируется до тех пор, пока вы не введете символ новой строки.