2009-03-18 14 views
40

Realmente no sé por qué, si la declaración de abajo no está ejecutando:declaración con comparación de cadenas no

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

A continuación se muestra toda la clase.

Probablemente es un problema lógico realmente estúpido, pero he estado tirando de mi pelo aquí por no ser capaz de resolver esto.

Gracias por mirar :)

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

Lástima que no podamos dar +1 para ediciones. –

+0

== medio; es este el mismo objeto No coincide con los objetos que contienen los mismos datos. –

+0

¿cómo es que está etiquetado 'multihilo'? – Asaf

Respuesta

86

En su ejemplo se comparan los objetos de cadena, no su contenido.

Su comparación debería ser:

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

O si s cadena de nulidad no le importa/o que realmente no les gusta NPE:

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

Prefiero s.equals ("/ quit"). Es cosméticamente pero quiero que los datos actuales importantes sean visibles fácilmente. – ReneS

+3

s.equales ("/ quit") lanzará una NullPointerException si s es nulo, "/quit".equals(s) nunca arrojará un NPE – basszero

+7

Entonces" /quit".equals(s) enmascara errores donde s involuntariamente nulo. – starblue

3

No deberías hacer comparaciones de cadenas con ==. Ese operador solo verificará si es la misma instancia, no el mismo valor. Use el método .equals para verificar el mismo valor.

30

Para comparar cadenas para la igualdad, no utilice ==. Los == operador comprueba para ver si dos objetos son exactamente el mismo objeto:

En Java hay muchas comparaciones de cadenas.

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

Comprueba que las referencias sean las mismas. –

4

Puede utilizar

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

o

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

El último hace una comparación lexicographic, y volverá a 0 si las dos cadenas son iguales.

4

Si codifica en C++ además de Java, es mejor recordar que en C++, la clase de cadena tiene el operador == sobrecargado. Pero no es así en Java. necesita usar equals() o equalsIgnoreCase() para eso.

11

String s en java son objetos, por lo que al comparar con ==, está comparando referencias, en lugar de valores. La forma correcta es usar equals().

Sin embargo, hay una manera. Si desea comparar objetos String utilizando el operador ==, puede hacer uso de la forma en que la JVM maneja las cadenas. Por ejemplo:

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

b habría true. ¿Por qué?

Porque la JVM tiene una tabla de constantes String.Por lo tanto, siempre que use literales de cadena (comillas "), la máquina virtual devuelve los mismos objetos y, por lo tanto, == devuelve true.

Puede usar la misma "tabla" incluso con cadenas que no sean literales utilizando el método intern(). Devuelve el objeto que corresponde al valor de cadena actual de esa tabla (o lo coloca allí, si no lo está). Por lo tanto:

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

ello se deduce que para cualquier par de secuencias s y t, s.intern() == t.intern() es verdadero si y sólo si s.equals (t) es verdadera.

Cuestiones relacionadas