2010-06-26 14 views
6

Ich probiere mehrere Übungen aus einem Java-Programmierbuch aus. Ich habe den Code unten:Problem mit "während" in Java

import java.io.*; 
import java.util.Scanner; 

public class Ex420 
{ 
public static void main(String args[]) 
{ 
    String employeeName = ""; 
    double workHours,excessHours, hourlyRates, grossPay; 
    Scanner input = new Scanner(System.in); 

    while (employeeName != "stop") 
    { 
    System.out.printf("\nInput employee name or stop to exit: "); 
    employeeName = input.nextLine(); 
    System.out.printf("Input working hours: "); 
    workHours = input.nextDouble(); 
    System.out.printf("Input hourly rates: "); 
    hourlyRates = input.nextDouble(); 

    if (workHours <= 40 & workHours >= 0) 
    { 
    excessHours = 0; 
    grossPay = hourlyRates * workHours; 
    System.out.printf("%s's gross pay is $%.2f\n", employeeName, grossPay); 
    } 
    else if (workHours > 40) 
    { 
    excessHours = workHours - 40; 
    grossPay = hourlyRates * 40 + 1.5 * hourlyRates * excessHours; 
    System.out.printf("\n%s's worked for %.1f excess hours.\n", employeeName, excessHours); 
    System.out.printf("%s's gross pay is $%.2f\n", employeeName, grossPay); 
    } 
    else 
    { 
    System.out.printf("Invalid input. Please try again."); 
    } 
    } // end while 
} // end main 
} // end class Ex420 

Das Problem ist, die while-Schleife nicht zu funktionieren scheint. Immer wenn ich "stop" als employeeName eingib, läuft das Programm einfach weiter. Ich habe versucht, "stop" durch einen anderen String zu ersetzen und es funktioniert immer noch nicht. Aber wenn ich versuche, employeeName mit "stop" zu initialisieren, wird das Programm sofort beendet, was erwartet wird. Was mache ich hier falsch?

Desweiteren überspringt das Programm nach der ersten Schleife immer die Frage nach dem employeeName. Ich versuchte, employeeName = input.nextLine(); durch employeeName = input.next(); zu ersetzen und es überspringt es nicht mehr. Ich frage mich jedoch, gibt es eine Möglichkeit, dass ich es nicht überspringe die Eingabe bei der Verwendung von employeeName = input.nextLine();?

Vielen Dank im Voraus für die Hilfe!

Antwort

7

Ich vermute es ist, weil der != Test, den Sie in der while Schleife verwenden, Strings für die Referenzgleichheit vergleicht. Das heißt, wenn ein Vergleich durchgeführt wird, wird nicht nur geprüft, ob die Strings die gleiche Zeichenfolge haben. es überprüft, ob sie das exakt gleiche Objekt sind. Aber wenn Scanner einen String erstellt, um den Text zu enthalten, den es von der Standardeingabe gelesen hat, wird String nicht dasselbe Objekt wie das Zeichenfolgenliteral "stop" in Ihrem Code sein. Es sind zwei Objekte, die zufällig denselben Inhalt haben, aber sie existieren an verschiedenen Stellen im Speicher, so dass sie als ungleich behandelt werden.

Lösung: Ihre Schleife wie dieser Stelle beginnen:

while (!"stop".equals(employeeName)) { 
13

Wenn Sie Zeichenfolgen in Java vergleichen, verwenden Sie die equals-Methode, nicht == oder! = Operators. Mit diesen Operatoren vergleichen Sie einfach Verweise auf Objekte und nicht auf deren Inhalt. Ihre Bedingung sollte wie folgt aussehen:

Beachten Sie, dass "Stop" zuerst ist, weil theoretisch Ihre Variable employeeName null sein kann. Auf diese Weise wird der Code NullPointerException nicht durch das Aufrufen der equals-Methode für das null-Objekt übergeben.

+1

Sie meinen wahrscheinlich "while (!" Stop ".equals (employeeName))' um die Bedeutung des Beispielcodes zu entsprechen, oder? – maerics

+0

Ich mag den 'Yoda' Ausdruck :) – VoodooChild

2

Das Problem ist, dass Sie nicht die richtige Struktur verwenden und Sie müssen equals() nicht == verwenden, um String s zu vergleichen. Die Grundstruktur Sie wollen, ist:

System.out.printf("\nInput employee name or stop to exit: "); 
String employeeName = input.nextLine(); 
while (!employeeName.equals("stop")) { 
    ... 
    System.out.printf("\nInput employee name or stop to exit: "); 
    employeeName = input.nextLine(); 
} 

Grundsätzlich müssen Sie überprüfen, ob der Benutzer eingegeben „Stopp“ sofort und die oben tut das. Deine Version nicht.

Nebenbei bemerkt, versuchen Sie, Java-Kodierungskonventionen einschließlich Abstand und geschweifte Klammerplatzierung zu übernehmen.

+0

Warum der Downvote? – cletus

+0

Danke für die Eingabe über die while-Schleife und die Programmierkonventionen! Ich habe nicht bemerkt, dass mein Abstand und die Platzierung davon abweichen. – bow

0

Ditto vorherigen Plakate auf == gegen Gleichen.

Es funktioniert, wenn Sie employeeName zu "stop" initialisieren, da der Java-Compiler zwei identische Zeichenfolgen sieht und das Objekt erneut verwendet. Das ist:

String employeeName = "stop"; if (mitarbeiterName == "stop") ... etc ...

Der Test wird als wahr ausgewertet, da Java ein Objekt erstellt, das die erste Zeichenfolge enthält, und dann feststellt, dass die zweite Zeichenfolge identisch ist, sodass das Objekt erneut verwendet wird und der Vergleich daher ein Objekt mit sich selbst vergleicht.

Wenn Sie stattdessen den employeeName von der Tastatur oder einer Datei lesen, weiß der Compiler natürlich nicht, was jemand eingeben wird, ein neues Objekt wird erstellt, um diesen Wert zu halten, und ein == Vergleich zwischen zwei Verschiedene String-Objekte geben false zurück.