4 Stimmen

Warum überspringt mein Programm eine Eingabeaufforderung in einer Schleife?

Mein Code soll eine Endlosschleife durchlaufen, bis "stop" als Mitarbeitername eingegeben wird. Ein Problem, das ich habe, ist, dass nach der Berechnung der Stunden und des Satzes des ersten Mitarbeiters die Eingabeaufforderung für den Mitarbeiternamen wieder übersprungen wird. Warum? (Der Code ist in 2 separaten Klassen, btw) Bitte helfen Sie. Hier ist mein Code:

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());
        }
    }
}

UND

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);
    }
}

6voto

Favonius Punkte 13720

Das Problem liegt bei:

eName = input.nextLine();

Ändern Sie dies in:

eName = input.next();

Es wird funktionieren.

Standardmäßig java.util.Scanner Klasse beginnt mit dem Parsen des Textes, sobald Sie die eingeben. Taste. Innerhalb der Schleife sollten Sie also fragen nach input.next(); da eine Zeile bereits in Bearbeitung ist.

Siehe Javadoc für beide Methoden.

2voto

Ted Hopp Punkte 227177

Ich gehe davon aus, dass es auf die Eingabe bei input.nextLine() aber die Aufforderung wird nicht angezeigt.

Ich vermute, dass es irgendwo ein Pufferungsproblem gibt - dass die Eingabeaufforderung zwar gedruckt wird, die Ausgabe aber nicht auf den Bildschirm gelangt. Versuchen Sie den Aufruf von System.out.flush() vor dem Aufruf input.nextLine() .

0voto

TimFoolery Punkte 1885

Ich habe noch nie Java benutzt, aber jetzt geht's los...

Rate = input.nextDouble();

Als Antwort auf diese Zeile könnten Sie "15.00" eingeben und dann {enter} drücken, wodurch eine "neue Zeile" in den Eingabestrom eingefügt wird, wodurch der Eingabestrom 15.00\n . Beim Extrahieren des Double bleibt die "neue Zeile" im Eingabestrom erhalten.

Wenn Sie versuchen, den Benutzer aufzufordern, den Namen eines anderen Mitarbeiters einzugeben, wird festgestellt, dass noch eine "neue Zeile" im Eingabestrom vorhanden ist, und es wird sofort der vorherige Zustand zurückgegeben, d. h. eine leere Zeichenfolge.

Um den Eingabestrom zu leeren, führen Sie eine Dummy-.nextLine aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X