2009-03-18 7 views
40

versagt Ich weiß wirklich nicht, warum die if-Anweisung unten nicht ausgeführt wird:If-Anweisung mit String Vergleich

if (s == "/quit") 
{ 
    System.out.println("quitted"); 
} 

Unten die ganze Klasse ist.

Es ist wahrscheinlich ein wirklich dummes logisches Problem, aber ich habe mir die Haare rausgerissen, um das nicht zu verstehen.

Dank für das Schauen :)

class TextParser extends Thread { 
    public void run() { 
     while (true) { 
      for(int i = 0; i < connectionList.size(); i++) { 
       try {    
        System.out.println("reading " + i); 
        Connection c = connectionList.elementAt(i); 
        Thread.sleep(200); 

        System.out.println("reading " + i); 

        String s = ""; 

        if (c.in.ready() == true) { 
         s = c.in.readLine(); 
         //System.out.println(i + "> "+ s); 

         if (s == "/quit") { 
          System.out.println("quitted"); 
         } 

         if(! s.equals("")) { 
          for(int j = 0; j < connectionList.size(); j++) { 
           Connection c2 = connectionList.elementAt(j); 
           c2.out.println(s); 
          } 
         } 
        } 
       } catch(Exception e){ 
        System.out.println("reading error"); 
       } 
      } 
     } 
    } 
} 
+2

Zu schade, dass wir +1 für Bearbeitungen nicht geben können. –

+0

== bedeutet; ist das das gleiche Objekt. Es stimmt nicht mit Objekten überein, die dieselben Daten enthalten. –

+0

Wie kommt es, dass 'Multithreading' markiert ist? – Asaf

Antwort

86

In Ihrem Beispiel, um die String-Objekte vergleichen, nicht dessen Inhalt.

sollte Ihr Vergleich sein:

if (s.equals("/quit")) 

Oder wenn s String Nichtigkeit hat nichts dagegen/oder Sie wirklich NPE nicht mögen:

if ("/quit".equals(s)) 
+1

bevorzuge ich am equals ("/ quit"). Es ist kosmetisch, aber ich möchte, dass die wichtigen aktuellen Daten leicht sichtbar sind. – ReneS

+3

s.equales ("/ quit") wird eine NullPointerException werfen ist s ist null, "/quit".equals(s) wird niemals eine NPE werfen – basszero

+7

Also" /quit".equals(s) wird Bugs maskieren wo s ist unbeabsichtigt null. – starblue

3

Sie sollten nicht String-Vergleiche machen mit ==. Dieser Operator überprüft nur, ob es sich um die gleiche Instanz und nicht um denselben Wert handelt. Verwenden Sie die .equals-Methode, um nach dem gleichen Wert zu suchen.

30

Um Strings für Gleichheit zu vergleichen, nicht verwenden ==. Die == Operator prüft, ob zwei Objekte sind genau das gleiche Objekt:

In Java es Vergleiche viele String sind.

String s = "something", t = "maybe something else"; 
if (s == t)  // Legal, but usually WRONG. 
if (s.equals(t)) // RIGHT 
if (s > t) // ILLEGAL 
if (s.compareTo(t) > 0) // also CORRECT> 
+0

Überprüft, ob die Referenzen identisch sind. –

4

können Sie

verwenden
if("/quit".equals(s)) 
    ... 

oder

if("/quit".compareTo(s) == 0) 
    ... 

Letztere einen lexicographic Vergleich macht, und wird 0 zurück, wenn die beiden Strings gleich sind.

4

Wenn Sie sowohl in C++ als auch in Java codieren, sollten Sie nicht vergessen, dass in C++ in der String-Klasse der Operator == überladen ist. Aber nicht so in Java. Sie müssen equals() oder equalsIgnoreCase() dafür verwenden.

11

String In Java sind Objekte, so dass Sie beim Vergleich mit == Referenzen statt Werte vergleichen. Der korrekte Weg ist equals() zu verwenden.

Allerdings gibt es einen Weg. Wenn Sie String Objekte mit dem Operator == vergleichen möchten, können Sie die Art und Weise nutzen, wie die JVM mit Strings umgeht. Zum Beispiel:

String a = "aaa"; 
String b = "aaa"; 
boolean b = a == b; 

b würde true sein. Warum?

Da die JVM eine Tabelle String Konstanten hat.Wenn Sie also String-Literale verwenden ("), gibt die virtuelle Maschine dieselben Objekte zurück, und daher gibt ==true zurück.

Sie können dieselbe "Tabelle" auch mit nicht-literalen Strings verwenden, indem Sie die Methode intern() verwenden. Es gibt das Objekt zurück, das dem aktuellen String-Wert aus dieser Tabelle entspricht (oder es dort platziert, falls dies nicht der Fall ist). Also:

String a = new String("aa"); 
String b = new String("aa"); 
boolean check1 = a == b; // false 
boolean check1 = a.intern() == b.intern(); // true 

Daraus folgt, dass für zwei beliebige Strings s und t, s.intern() == t.intern() wahr ist, wenn und nur wenn s.equals (t) gilt.