Как осуществление для моего курса 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.
Взгляд на javadoc должен показать вам, почему.
Scanner.nextLine()
переходит к концу текущей строки и возвращает все, что пропустил. Поскольку пользователь уже ввел некоторые данные, эта функция вернет все, что осталось в потоке ввода. Когда вы переключаете порядок, у нее еще нет ввода, поэтому она запрашивает ввод.
Важная часть:
Этот метод возвращает остаток текущей строки, исключая любой разделитель строк в конце.
Scanner.nextInt улавливает первое вхождение целого числа и ничего больше, поэтому он не обрабатывает символ новой строки, который Scanner.readLine будет рассматривать как входной. Вы можете добавить Scanner.next () между ними, который будет использовать символ новой строки, но у этого решения есть свои недостатки.
Моим решением было бы прочитать весь ввод пользователя с помощью Scanner.readLine и проанализировать желаемые результаты из строк.
NextInt ()
просто потребляет целочисленное значение. Как только метод убедится, что вводимый ввод является полным числом, он выходит, не используя символы, полученные при нажатии клавиши возврата. Когда вы вызываете NextLine ()
, он видит возвращаемые символы в буфере и немедленно возвращает строку нулевой длины.
Чтобы справиться с этим, я рекомендую всегда использовать NextLine ()
. Пользователи командной строки очень привыкли к тому, что клавиша возврата является клавишей «введите значение». Анализируйте результаты NextLine ()
как целое число, используя Integer.valueOf (result)
.
Из этот поток :
Причина, по которой у вас возникают проблемы, заключается в том, что когда пользователь вводит целое число, затем нажимает клавишу ВВОД, два только что введены данные: целое число и «новая строка», которая равна
\ n
.
Вызываемый вами метод «nextInt
» считывает только целое число, которое оставляет новую строку во входном потоке.
Но вызовnextLine ()
действительно читается в символах новой строки, поэтому вам пришлось вызватьnextLine ()
, прежде чем ваш код заработает.
Вы также могли бы вызватьnext ()
, который также прочитал бы в новой строке.