2009-10-07 13 views
7

Ok, esto es estúpido, pero ¿qué sucede?¿Por qué no funciona mi comparación de cadenas?

Tengo una variable String en un servlet, que toma el valor de un parámetro y en función de ese valor realizo una prueba para hacer algo, pero el if no funciona. ¿Cuál es el problema?

String action = request.getParameter("action"); 
    System.out.println("Action: " + action); 
// I put 2 ifs to be sure, but not even one is working 
    if(action.equals("something")) 
      { 
       System.out.println("hey");    
      } 
    if(action.trim() == "something") 
      { 
       System.out.println("hey"); 
      } 

En la consola, el System.out.println me demuestra que el valor de la acción es "algo"

Action: something 
+0

¿Qué no está funcionando? ¿Se imprimió "hey" solo una vez, y esperaba que se imprimiera dos veces? ¿No apareció "hey" en tu consola? –

+0

Es bastante específico: // Puse 2 ifs para estar seguro, pero ni siquiera uno está funcionando. – dpq

+8

Por favor no lo llame "JAVA" - es "Java". El nombre no es un acrónimo, por lo que no necesita escribirlo con mayúsculas. – Jesper

Respuesta

37

Su segunda comparación es incorrecta. También debe utilizar en lugar de equals==, así:

if (action.trim().equals("something")) 

El operador compara == referencias de objetos (cuerdas) y en circunstancias normales iguales cadenas no tienen automáticamente la misma referencia, es decir, son diferentes objetos. (A menos que ambos sean internalized, pero normalmente no debería considerarlo)

Aparte de eso, su ejemplo funciona bien y la primera comparación es válida. Intenta arreglar la segunda comparación. Si funciona, encontraste tu problema. Si no, intente usar un depurador y vuelva a verificar todo.

PS: Al comparar las cadenas literales con objetos de cadena dinámicos, es una buena práctica para llamar al método equals en la cadena literal:

"something".equals(action) 

esa manera se puede evitar NullPointerExceptions cuando el objeto de cadena es nula.

+8

+1 para llamar es igual a la cadena literal para evitar NullPointerException. –

-7

El método equals compara las cadenas para la identidad del objeto y no compara el contenido. Para comparar el contenido de dos cadenas, use el método compareTo.

+10

Esto es completamente incorrecto. 'String.equals()' compara las cadenas y devuelve 'true' si son iguales, tal como cabría esperar. – Bombe

0

Solo una conjetura descabellada: podría ser que uno de estos "algo" contiene, por ejemplo, un carácter cirílico que se ve idéntico a su homólogo latino. En este caso, podría ser la "o".

9

Es poco probable que su segunda condición sea verdadera: está probando si el objeto de cadena creado al recortar action es el mismo objeto que la cadena literal "something". Esto solo será cierto si action se establece en ese mismo valor literal en otro lugar. Use "something".equals(action.trim()) en su lugar.

Su primera condición sería verdadera, los caracteres en la cadena action son los caracteres "something". Si no es verdad, entonces no es así. Afírmalo en una prueba, conéctalo, imprímelo o míralo en un depurador.

Si imprime una cadena para la depuración, use algo como System.out.println ("String = >" + string + "<"); para que sea obvio si hay espacios al final.

+0

Su respuesta debe ser preferida, es más correcta e incluso evita NPE: s (en teoría, no en este caso exacto aunque). Oh, bueno, aquí hay que esperar que muchos otros pueblos lo noten también. – Esko

+0

+1 para imprimir cadenas dentro de ">", esto acaba de resaltar una nueva línea final que estaba jugando con mi string.matches()! – shearn89

4

La comparación de cadenas en Java no puede hacerse por ==.

usted tiene que utilizar String.equals() o String.compareTo() -

Por cierto, String.compareTo() vuelve 0 mientras String.equals() vuelve true cuando dos cadenas son iguales.

Ver: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#equals(java.lang.Object)

+1

Lo que dices es cierto, pero sería más útil si explicaras _por qué_ es cierto. (Es decir, 'a.equals (b)' prueba si el contenido de las dos cadenas es el mismo, pero 'a == b' solo devuelve verdadero cuando a y b se refieren al mismo objeto String.) –

1

Mi conjetura es que tienes detrás o espacios que no muestran en el println líder.

Combina esto con el hecho de que estás usando action.trim() == 'something' significa que esta prueba tampoco funcionará.

Cambie esto a .equals("something") según lo sugerido por otros y podría funcionar.

+1

A menudo hago 'System.out.println (" Acción: ["+ acción + ']');' para depurar ya que entonces puede ver los espacios finales. –

+0

Lo sentimos, debería ser 'System.out.println (" Acción: ["+ acción +"] ");'. He estado escribiendo JavaScript esta mañana :) –

1

Puede proteger mejor contra valores nulos cambiando las cláusulas if para que la cadena sea literal primero.

Pero ya que también parece querer proteger contra los espacios en blanco en el valor del parámetro, también se puede hacer un ajuste seguro nula del valor del parámetro utilizando StringUtils.trimToEmpty de Apache Commons Lang:

String action = StringUtils.trimToEmpty(request.getParameter("action")); 

System.out.println("Action: " + action); 

if("something".equals(action)) { 
    System.out.println("hey");    
} 
0

intente esto:

String action = request.getParameter("action"); 
System.out.println("Action: " + action); 

if(action.trim().equals("something")) 
{ 
    System.out.println("hey");    
} 
Cuestiones relacionadas