Почему строка 17 этой Java-программы не выполняется? - PullRequest
6 голосов
/ 10 марта 2010

В качестве упражнения для моего курса 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 Update 18 и TextPad 5.3.1.

Ответы [ 4 ]

5 голосов
/ 10 марта 2010

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

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

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

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

5 голосов
/ 10 марта 2010

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

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

1 голос
/ 10 марта 2010

С этой цепочкой :

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

0 голосов
/ 10 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...