Почему является строка 17 из этой программы Java, не выполняемой?

Как осуществление для моего курса Java в Uni этим утром, я должен был записать небольшую программу, чтобы попросить, чтобы пользователь ввел некоторые детали, затем распечатать их назад. Я с тех пор закончил писать это, но я столкнулся со странной проблемой по пути.

См. код ниже:

import java.util.Scanner;

public class Scanner_Exercise
{
    public static void main (String[] args)
    {
        Scanner keyboardIn = new Scanner(System.in);

        int accountId;
        String accountName;
        float accountBalance;

        System.out.println("Account ID: "); //Line 13
        accountId = keyboardIn.nextInt(); //Line 14

        System.out.println("Account name: "); //Line 16
        accountName = keyboardIn.nextLine(); //Line 17

        System.out.println("Account balance: ");
        accountBalance = keyboardIn.nextFloat();
    }
}

Когда это прогоны программы, строка 17 (обращаются к комментариям) пропускается; Account name: печатается, но пользователю не дают возможность ввести информацию, как будто та строка кода была прокомментирована. Никакие ошибки не брошены. Вывод похож на это:

Идентификатор учетной записи:
2
Имя учетной записи:
Остаток на счете:

Однако, если я переключаю строки 13 и 14 с 16 и 17, как следующим образом, прекрасные прогоны программы, и никакие строки пропускаются.

System.out.println("Account name: "); //Line 16
accountName = keyboardIn.nextLine(); //Line 17

System.out.println("Account ID: "); //Line 13
accountId = keyboardIn.nextInt(); //Line 14

Почему строка 17 пропускаемый в первом случае, но не второе?

Если это так или иначе релевантно, я использую Обновление JDK 6 18, и TextPad 5.3.1.

6
задан Bill the Lizard 20 September 2012 в 12:58
поделиться

4 ответа

Взгляд на javadoc должен показать вам, почему.

Scanner.nextLine() переходит к концу текущей строки и возвращает все, что пропустил. Поскольку пользователь уже ввел некоторые данные, эта функция вернет все, что осталось в потоке ввода. Когда вы переключаете порядок, у нее еще нет ввода, поэтому она запрашивает ввод.

Важная часть:

Этот метод возвращает остаток текущей строки, исключая любой разделитель строк в конце.

5
ответ дан 9 December 2019 в 22:32
поделиться

Scanner.nextInt улавливает первое вхождение целого числа и ничего больше, поэтому он не обрабатывает символ новой строки, который Scanner.readLine будет рассматривать как входной. Вы можете добавить Scanner.next () между ними, который будет использовать символ новой строки, но у этого решения есть свои недостатки.

Моим решением было бы прочитать весь ввод пользователя с помощью Scanner.readLine и проанализировать желаемые результаты из строк.

0
ответ дан 9 December 2019 в 22:32
поделиться

NextInt () просто потребляет целочисленное значение. Как только метод убедится, что вводимый ввод является полным числом, он выходит, не используя символы, полученные при нажатии клавиши возврата. Когда вы вызываете NextLine () , он видит возвращаемые символы в буфере и немедленно возвращает строку нулевой длины.

Чтобы справиться с этим, я рекомендую всегда использовать NextLine () . Пользователи командной строки очень привыкли к тому, что клавиша возврата является клавишей «введите значение». Анализируйте результаты NextLine () как целое число, используя Integer.valueOf (result) .

5
ответ дан 9 December 2019 в 22:32
поделиться

Из этот поток :

Причина, по которой у вас возникают проблемы, заключается в том, что когда пользователь вводит целое число, затем нажимает клавишу ВВОД, два только что введены данные: целое число и «новая строка», которая равна \ n .
Вызываемый вами метод « nextInt » считывает только целое число, которое оставляет новую строку во входном потоке.
Но вызов nextLine () действительно читается в символах новой строки, поэтому вам пришлось вызвать nextLine () , прежде чем ваш код заработает.
Вы также могли бы вызвать next () , который также прочитал бы в новой строке.

1
ответ дан 9 December 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: