2009-03-18 15 views
40

io davvero non so perché l'istruzione if di seguito non è in esecuzione:Se dichiarazione con confronto String non riesce

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

Di seguito si riporta l'intera classe.

Probabilmente è un problema di logica davvero stupido, ma mi sono tirato fuori i capelli senza riuscire a capirlo.

Ringraziamenti per lo sguardo :)

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

Peccato che non possiamo dare +1 per le modifiche. –

+0

== significa; è questo lo stesso oggetto. Non corrisponde agli oggetti che contengono gli stessi dati. –

+0

come mai è etichettato come 'multithreading'? – Asaf

risposta

86

Nel tuo esempio si stanno confrontando gli oggetti stringa, non il loro contenuto.

vostro confronto dovrebbe essere:

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

O se s stringa di nullità non mente/o davvero non piace NPE:

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

Preferisco s.equals ("/ quit"). È cosmetico, ma voglio che i dati attuali importanti siano visibili facilmente. – ReneS

+3

s.equales ("/ quit") getterà un NullPointerException è s è nullo, "/quit".equals(s) non getterà mai un NPE – basszero

+7

Quindi" /quit".equals(s) maschererà i bug dove s è involontariamente nullo. – starblue

3

Si consiglia di non fare confronti di stringhe con ==. Quell'operatore controllerà solo per vedere se è la stessa istanza, non lo stesso valore. Utilizzare il metodo .equals per verificare lo stesso valore.

30

Per confrontare stringhe per l'uguaglianza, non utilizzare ==. I == operatore controlla per vedere se due oggetti sono esattamente lo stesso oggetto:

In Java ci sono molti confronti tra stringhe.

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

Controlla che i riferimenti siano gli stessi. –

4

È possibile utilizzare

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

o

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

Quest'ultimo fa un confronto lexicographic, e tornerà 0 se le due stringhe sono uguali.

4

Se si esegue il codice sia in C++ che in Java, è meglio ricordare che in C++, la classe string ha l'operatore == sovraccarico. Ma non così in Java. è necessario utilizzare equals() o equalsIgnoreCase() per quello.

11

String s in java sono oggetti, quindi quando si confronta con ==, si confrontano i riferimenti, piuttosto che i valori. Il modo corretto è usare equals().

Tuttavia, c'è un modo. Se si desidera confrontare gli oggetti String utilizzando l'operatore ==, è possibile utilizzare il modo in cui JVM gestisce le stringhe. Per esempio:

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

b sarebbe true. Perché?

Poiché la JVM ha una tabella di costanti String.Pertanto, ogni volta che si utilizzano stringhe letterali (virgolette "), la macchina virtuale restituisce gli stessi oggetti e pertanto == restituisce true.

È possibile utilizzare la stessa "tabella" anche con stringhe non letterali utilizzando il metodo intern(). Restituisce l'oggetto che corrisponde al valore di stringa corrente da quella tabella (o lo inserisce lì, se non lo è). Quindi:

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

Ne consegue che per ogni due stringhe s e t, s.intern() == t.intern() è vera se e solo se s.equals (t) è vero.