wilma2202 Ответов: 2

Java beginner нуждается в помощи для решения проблемы цикла while


Задание требует, чтобы я сделал простой "генератор благодарственных писем", где я ввожу имя и сумму пожертвованных денег, и он генерирует электронное письмо. Вот исходный код:

    while (keepgoing)
        {
            
            
            
            out.println("What is the persons name?");
            
            String personname = keyboard.nextLine();
            
            out.println("How much did they donate?");
            
            int donation = keyboard.nextInt();
            
            out.println(" Dear " + personname + "");
            out.println("Thankyou for your donation of  $"   + donation + "\n");
            
           
            out.println("Regards, Will");

For the first run it works as needed, but on the second it skips the String input and goes straight to the Int.

What I have tried:

It works as needed if personname is an int variable, no matter how many times it loops but once I switch back to String it skips again..

2 Ответов

Рейтинг:
8

Peter Leow

Добавьте новую строку после каждого nextInt():

int donation = keyboard.nextInt();
keyboard.nextLine();
следующая линия()[^] и nextInt()[^] вести себя иначе.
+++++[Более Подробно]+++++
nextInt() принимает только следующее введенное целое число, игнорируя новую строку, которая затем принимается
String personname = keyboard.nextLine()
в следующей итерации это объясняло, почему он был пропущен, не дожидаясь ввода пользователя. Автономная keyboard.nextLine() после nextInt () - это просто хак, чтобы поглотить эту оставшуюся новую строку, прежде чем она перейдет к String personname = keyboard.nextLine().


wilma2202

Большое спасибо!

Вы можете объяснить мне, почему это происходит?

Peter Leow

Добавлено в мое решение.

Рейтинг:
1

Patrice T

Цитата:
но на втором он пропускает строковый ввод и переходит прямо к Int.

Нет, это не волшебный пропуск строки!
Просто когда достигают исполнения keyboard.nextLine(), он находит все, что ему нужно в буфере клавиатуры, а затем обрабатывает его, не дожидаясь.
в качестве доказательства введите пожертвование как "123 456abc"
123<Space>456abc<Enter>

"456abc" будет вашим следующим "именем человека".

Вам необходимо ознакомиться с документацией о функциях ввода с клавиатуры.


wilma2202

Хорошо, как же мне тогда это исправить? Курс, который я делаю, никогда не упоминал, что такое буфер клавиатуры ... можете ли вы порекомендовать мне видео или статью для чтения?

Patrice T

Я вижу, вы уже получили ответ в решении 2.
Как уже было предложено, это хорошая идея, чтобы прочитать документацию.