2012-04-12 11 views
3

Ich bin ein Anfänger, der Java studiert und für meine Prüfungen revidiert, indem er die Fragen zu früheren Examensarbeiten beantwortet und es gibt eine Frage, auf der ich feststecke.Korrigieren eines Java-Programmcodefragments

Betrachten Sie das folgende Codefragment, das einen Eingabebefehl liest und dann verarbeitet.

String cmd = scanner.next(); 

if (cmd == "forward") 
    robot.forward(1); 
else if (cmd == "turn") 
    robot.turn(); 
else 
    System.out.println("Unknown command: " + cmd); 

Wenn das Programm Testen der Scanner in der String liest „vorwärts“ in cmd, aber das Programm gibt „Unbekannter Befehl: Vorwärts“.

a) Erklären Sie im Detail, warum dies geschieht.

b) Welche Änderungen sollten am Code vorgenommen werden, um diesen Fehler zu korrigieren?

Wenn jemand kann mir helfen Frage zu beantworten a) und b) Ich wäre dankbar.

p.s. Ich verstehe, dass dies keine Website ist, um nur nach Antworten zu suchen (#noeasywayout), also werde ich mein Bestes geben, hier nicht gierig zu handeln. Ich entschuldige mich für etwaige Unannehmlichkeiten.

+1

Also hast du den Code ausprobiert? Hast du schon irgendwelche Ideen? –

+1

Um nur auf die Richtung zu zeigen, kann man 'String' mit' == 'nicht vergleichen. Es ist besser, wenn Sie es selbst herausfinden. –

Antwort

8

Diese alte Kastanie ...

in Java, ==-Tests, wenn die beiden Operanden die exakt gleiche Objekt, sind die offensichtlich nicht sie sind (eines der Objekte eine String-Konstante ist, die andere wurde von der Eingabe gelesen).

Verwendung String.equals() Methode ihre Wert zu vergleichen.

Versuchen Sie folgendes:

if (cmd.equals("forward")) 
    robot.forward(1); 
else if (cmd.equals("turn")) 
    robot.turn(); 
else 
    System.out.println("Unknown command: " + cmd); 

BTW, mit diesem Muster von Code, passen .equals() auf cmd aufrufen, wenn es null ist - Sie NPE bekommen. Ein üblicher Weg, dies zu vermeiden, ohne Code hinzuzufügen, ist einen „yoda Test“ (eines mit einer „umgekehrten“ Logik) zu verwenden:

if ("forward".equals(cmd)) 
    robot.forward(1); 
else if ("turn".equals(cmd)) 
    robot.turn(); 
else 
    System.out.println("Unknown command: " + cmd); 

Dieser Code wird keine NPE werfen, wenn cmd ist null

+0

Ist es nicht Yoda ?? – hmjd

+1

@hmjd Yoda es * ist *, nicht joda. Richtig bist du! – Bohemian

2

Versuchen Sie cmd.equalsIgnorecase oder cmd.equals anstelle von ==.

Der Grund, String ist ein Objekt, und wenn Sie das == es tut Objekt Vergleich.

+2

Sicher können Sie ein Objekt mit einem String vergleichen. Ein String ist auch ein Objekt. –

+1

Ja Entschuldigung, ich tippte zu schnell. Ich meinte das == wird für den Objektvergleich nicht für den String-Vergleich verwendet. – Namphibian

+0

Fest und Zeit, nach Hause zu gehen und einen Kaffee zu trinken. – Namphibian

2

zu diesem Abschnitt finden Sie im Java Language Specification:

15.21.3 Referenz Gleichheitsoperator == und =

Während == verwendet werden kann, Bezug auf dem Vergleich Ein solcher Gleichheitstest bestimmt, ob die beiden Operanden auf das gleiche String-Objekt verweisen oder nicht.Das Ergebnis ist false, wenn die Operanden unterschiedliche String-Objekte sind, auch wenn sie die gleiche Zeichenfolge enthalten. Der Inhalt von zwei Strings s und t kann durch den Methodenaufruf s.equals (t) auf Gleichheit geprüft werden.

Verwandte Themen