Как правильно использовать цикл while, чтобы заполнить 2 Arraylists пользовательским вводом? - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь написать программу, которая просит пользователя сначала ввести имя (строку), а затем сумму (удвоить) и поместить ввод в 2 отдельных Arraylists.Это делается через цикл while.Когда пользователь закончит, он может нажать 0, и тогда программа напечатает оба массива.Первый раз, когда цикл проходит идеально, во второй раз он напечатает обе строки, запрашивая ввод, не допуская ввода между ними.При повторном вводе будет отображаться исключение InputMismachtException.

Scanner userInput = new Scanner(System.in);
ArrayList<String> customerName = new ArrayList<>();
ArrayList<Double> customerSpend = new ArrayList<>();
double checkUserInput = 1;

while (checkUserInput != 0) {
    System.out.println("Please enter the customer name");
    customerName.add(userInput.nextLine());
    System.out.println("Please enter the customer amount");
    customerSpend.add(userInput.nextDouble());
    if (customerSpend.get(customerSpend.size()-1) == 0){
        checkUserInput = 0;
    }
}
for (int i = 0; i < customerName.size(); i++) {
    System.out.println(customerName.get(i)+customerSpend.get(i));
}

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Это потому, что метод Scanner.nextDouble не читает символ новой строки в вводе, созданном нажатием «Enter», и поэтому вызов Scanner.nextLine возвращается после чтения этой новой строки.

Вы столкнетесь саналогичное поведение при использовании Scanner.nextLine после Scanner.next () или любого метода Scanner.nextFoo (кроме самого nextLine).

Что я предлагаю, это вызвать дополнительный userInput.nextLine () сразу послеВы вызываете userInput.nextDouble (), чтобы прочитать это extraline.

0 голосов
/ 09 февраля 2019

nextDouble() читает только токен в строке и не будет читать всю строку.поэтому, когда nextLine() будет выполнен, он прочитает оставшуюся строку, а name, введенный вами в консоли, будет прочитан nextDouble(), и это выдает InputMismachtException

Сканирует следующий токенввод как двойной.

Поэтому, чтобы избежать этого, вы можете использовать nextLine() и разобрать значение в Double

Вы можете использовать nextLine() и проанализировать значение вDouble

while (checkUserInput != 0) {
    System.out.println("Please enter the customer name");
    customerName.add(userInput.nextLine());
    System.out.println("Please enter the customer amount");
    customerSpend.add(Double.parseDouble(userInput.nextLine()));

    if (customerSpend.get(customerSpend.size()-1) == 0){
        checkUserInput = 0;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...