Почему моя программа пропускает запрос в цикле? - PullRequest
4 голосов
/ 22 февраля 2011

Мой код должен непрерывно выполняться до тех пор, пока в качестве имени сотрудника не будет введен «стоп». Проблема, с которой я сталкиваюсь, заключается в том, что, как только он вычислит часы и ставку первого сотрудника, он снова пропустит запрос на ввод имени сотрудника. Зачем? (Код в 2 отдельных классах, кстати) Пожалуйста, помогите. Вот мой код:

package payroll_program_3;
import java.util.Scanner;

public class payroll_program_3
{
    public static void main(String[] args)
    {

        Scanner input = new Scanner( System.in );

        employee_info theEmployee = new employee_info();

        String eName = "";
        double Hours = 0.0;
        double Rate = 0.0;
        while(true)
        {
            System.out.print("\nEnter Employee's Name: ");
            eName = input.nextLine();
            theEmployee.setName(eName);
            if (eName.equalsIgnoreCase("stop"))
            {
                return;
            }

            System.out.print("\nEnter Employee's Hours Worked: ");
            Hours = input.nextDouble();
            theEmployee.setHours(Hours);
            while (Hours <0)    //By using this statement, the program will not
            {                   //allow negative numbers.
                System.out.printf("Hours cannot be negative\n");
                System.out.printf("Please enter hours worked\n");
                Hours = input.nextDouble();
                theEmployee.setHours(Hours);
            }

            System.out.print("\nEnter Employee's Rate of Pay: ");
            Rate = input.nextDouble();
            theEmployee.setRate(Rate);
            while (Rate <0)    //By using this statement, the program will not
            {                  //allow negative numbers.
                System.out.printf("Pay rate cannot be negative\n");
                System.out.printf("Please enter hourly rate\n");
                Rate = input.nextDouble();
                theEmployee.setRate(Rate);
            }

            System.out.print("\n Employee Name:     " + theEmployee.getName());
            System.out.print("\n Employee Hours Worked:     " + theEmployee.getHours());
            System.out.print("\n Employee Rate of Pay:     " + theEmployee.getRate() + "\n\n");
            System.out.printf("\n %s's Gross Pay: $%.2f\n\n\n", theEmployee.getName(),
                theEmployee.calculatePay());
        }
    }
}

И

package payroll_program_3;

        public class employee_info
{
            String employeeName;
            double employeeRate;
            double employeeHours;

public employee_info()
    {
    employeeName = "";
    employeeRate = 0;
    employeeHours = 0;
    }

public void setName(String name)
    {
    employeeName = name;
    }

public void setRate(double rate)
    {
    employeeRate = rate;
    }

public void setHours(double hours)
    {
    employeeHours = hours;
    }

public String getName()
    {
    return employeeName;
    }

public double getRate()
    {
    return employeeRate;
    }

public double getHours()
    {
    return employeeHours;
    }

public double calculatePay()
    {
    return (employeeRate * employeeHours);
    }
}

Ответы [ 3 ]

6 голосов
/ 22 февраля 2011

Проблема в:

eName = input.nextLine();

Измените это на:

eName = input.next();

Это будет работать.

По умолчанию класс java.util.Scanner начинает анализировать текст, как только вы нажмете клавишу enter . Поэтому внутри цикла вы должны запрашивать input.next();, поскольку строка уже обрабатывается.

См. Javadoc для обоих методов.

2 голосов
/ 22 февраля 2011

Я предполагаю, что он ожидает ввода в input.nextLine(), но подсказка не появляется.

Я предполагаю, что где-то есть проблема с буферизацией & mdash; что подсказка печатается, но вывод не попадает на экран. Попробуйте позвонить System.out.flush(), прежде чем звонить input.nextLine().

0 голосов
/ 22 февраля 2011

Никогда не использовал Java в моей жизни, но здесь это идет ...

Rate = input.nextDouble();

В ответ на эту строку вы можете ввести «15.00», а затем нажать {enter}, что поместит «новую строку» во входной поток, сделав входной поток 15.00\n. При извлечении двойника «новая строка» останется во входном потоке.

Когда вы пытаетесь запросить у пользователя имя другого сотрудника, он читает, что во входном потоке все еще есть «новая строка», и он немедленно вернет то, что было до этого, то есть пустую строку.

Чтобы очистить входной поток, запустите фиктивный файл .nextLine.

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