web-dev-qa-db-fra.com

Si l'instruction avec la comparaison de chaîne échoue

Je ne sais vraiment pas pourquoi la déclaration if ci-dessous n'est pas exécutée:

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

Ci-dessous est la classe entière.

C’est probablement un problème de logique vraiment stupide, mais je me suis tiré la tête, ne pas être en mesure de le comprendre.

Merci d'avoir regardé :)

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");
                }
            }
        }
    }
}
41
Andrea

Dans votre exemple, vous comparez les objets chaîne, pas leur contenu.

Votre comparaison devrait être:

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

Ou si s la nullité de la chaîne ne vous dérange pas/ou si vous n'aimez vraiment pas les NPE:

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

Pour comparer les chaînes pour l’égalité, ne pas utiliser ==. L'opérateur == vérifie si deux objets sont exactement le même objet:

En Java, il existe de nombreuses comparaisons de chaînes.

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>
32
TStamper

Strings in Java sont des objets. Ainsi, lorsque vous comparez avec ==, vous comparez des références plutôt que des valeurs. La méthode correcte consiste à utiliser equals().

Cependant, il y a un moyen. Si vous souhaitez comparer des objets String à l'aide de l'opérateur ==, Vous pouvez utiliser la façon dont la machine virtuelle Java traite les chaînes. Par exemple:

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

b serait true. Pourquoi?

Parce que la JVM a une table de constantes String. Ainsi, chaque fois que vous utilisez des littéraux de chaîne (guillemets "), La machine virtuelle renvoie les mêmes objets , et donc == renvoie true.

Vous pouvez utiliser la même "table" même avec des chaînes non littérales en utilisant la méthode intern() . Elle retourne l'objet qui correspond à la valeur de chaîne actuelle de cette table (ou la met ici, si ce n'est pas le cas). Alors:

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

Il en résulte que pour deux chaînes quelconques, s et t, s.intern () == t.intern () est vrai si et seulement si s.equals (t) est vrai.

11
Bozho

Vous ne devriez pas faire de comparaisons de chaînes avec ==. Cet opérateur vérifiera uniquement s'il s'agit de la même instance, pas de la même valeur. Utilisez la méthode .equals pour rechercher la même valeur.

4
digitaljoel

Si vous codez en C++ aussi bien qu'en Java, il est préférable de se rappeler qu'en C++, l'opérateur de classe == est surchargé. Mais pas en Java. vous devez utiliser equals() ou equalsIgnoreCase() pour cela.

4
user855

Vous pouvez utiliser

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

ou

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

Ce dernier effectue une comparaison lexicographique et renvoie 0 si les deux chaînes sont identiques.

4
littleduckie