Warum funktioniert mein Stringvergleich nicht?

7

Ok, das ist dumm, aber wtf geht weiter?

Ich habe eine String-Variable in einem Servlet, die den Wert eines Parameters annimmt und basierend auf diesem Wert mache ich einen Test, aber der if funktioniert nicht. Was ist das Problem?

%Vor%

In der Konsole zeigt mir System.out.println, dass der Wert der Aktion "etwas" ist

%Vor%     
cc. 07.10.2009, 10:49
quelle

8 Antworten

37

Ihr zweiter Vergleich ist falsch. Sie sollten auch equals anstelle von == verwenden, wie folgt:

%Vor%

Der == -Operator vergleicht Referenzen von (String) -Objekten und unter normalen Umständen haben gleiche -Strings nicht automatisch die gleiche Referenz, d. h. sie sind unterschiedliche Objekte. (Es sei denn, beide sind internalisiert , aber normalerweise du solltest es nicht berücksichtigen)

Ansonsten funktioniert Ihr Beispiel gut und der erste Vergleich ist gültig. Versuchen Sie, den zweiten Vergleich zu korrigieren. Wenn es funktioniert, hast du dein Problem gefunden. Wenn nicht, versuchen Sie es mit einem Debugger und überprüfen Sie alles.

PS: Beim Vergleich von literalen Strings mit dynamischen String-Objekten ist es ratsam, die Methode equals für die literale Zeichenfolge aufzurufen:

%Vor%

Auf diese Weise können Sie NullPointerExceptions vermeiden, wenn das Zeichenfolgenobjekt null ist.

    
Daniel Rikowski 07.10.2009, 10:54
quelle
9

Ihre zweite Bedingung ist wahrscheinlich nie wahr - Sie testen, ob das String-Objekt, das durch das Beschneiden von action erstellt wurde, dasselbe Objekt wie das String-Literal "something" ist. Dies ist nur dann der Fall, wenn action auf denselben literalen Wert an anderer Stelle gesetzt ist. Verwenden Sie stattdessen "something".equals( action.trim() ) .

Ihre erste Bedingung wäre wahr, die Zeichen in der Zeichenfolge action sind die Zeichen "something" . Wenn es nicht wahr ist, dann nicht. Setze es in einem Test durch, logge es ein, drucke es aus oder schaue es in einem Debugger an.

Wenn Sie eine Zeichenkette zum Debuggen ausgeben, verwenden Sie etwas wie System.out.println ( "String = >" + string + "<" ); , so dass es offensichtlich ist, wenn es Leerzeichen gibt.

    
Pete Kirkham 07.10.2009 10:56
quelle
4

Stringvergleich in Java kann nicht von == durchgeführt werden.

Sie müssen String.equals() oder String.compareTo() -

verwenden

Übrigens, String.compareTo() gibt 0 zurück, während String.equals() true zurückgibt, wenn zwei Zeichenfolgen gleich sind.

Siehe: Ссылка

    
JCasso 07.10.2009 10:59
quelle
1

Meine Vermutung ist, dass Sie nachlaufende oder führende Leerzeichen haben, die nicht im println angezeigt werden.

Kombinieren Sie dies mit der Tatsache, dass Sie action.trim() == 'something' verwenden, bedeutet dies, dass dieser Test auch nicht funktioniert.

Schalten Sie diese auf .equals("something") um, wie von anderen vorgeschlagen, und es könnte funktionieren.

    
Chris R 07.10.2009 11:05
quelle
1

Sie können besser vor Nullen schützen, indem Sie die if-Klauseln umschalten, damit das String-Literal zuerst angezeigt wird.

Da Sie aber anscheinend auch vor dem Leerzeichen auf dem Parameterwert schützen möchten, können Sie auch eine Nullabgleichfunktion des Parameterwerts verwenden, indem Sie StringUtils.trimToEmpty von Apache Commons Lang :

%Vor%     
A_M 07.10.2009 11:14
quelle
0

Nur eine wilde Vermutung: könnte sein, dass einer dieser "Somethings" z. ein kyrillisches Zeichen, das mit seinem lateinischen Gegenstück identisch aussieht. In diesem Fall könnte es das "o" sein.

    
dpq 07.10.2009 10:55
quelle
0

versuche das:

%Vor%     
user486760 25.10.2010 18:17
quelle
-7

Die equals-Methode vergleicht die Zeichenfolgen für die Objektidentität und vergleicht nicht den Inhalt. Verwenden Sie die compareTo-Methode, um den Inhalt von zwei Zeichenfolgen zu vergleichen.

    
Frank 07.10.2009 10:55
quelle

Tags und Links