Indien verklaring met stringvergelijking mislukt

Ik weet echt niet waarom de onderstaande verklaring niet wordt uitgevoerd:

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

Hieronder is de hele klas.

Het is waarschijnlijk een echt stomme logische probleem, maar ik heb mijn haar erop getrokken, hier niet in staat om dit uit te zoeken.

Bedankt voor het kijken 🙂

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

Antwoord 1, Autoriteit 100%

In uw voorbeeld vergelijkt u de tekenreeksobjecten, niet hun inhoud.

Uw vergelijking zou moeten zijn:

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

Of als de ongeldigheid van de tekenreeks shet niet erg vindt / of je NPE’s echt niet leuk vindt:

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

Antwoord 2, autoriteit 37%

Om Strings voor gelijkheid te vergelijken, gebruik geen ==. De operator ==controleert of twee objecten precies hetzelfde object zijn:

In Javazijn er veel tekenreeksvergelijkingen.

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>

Antwoord 3, autoriteit 12%

Stringen in java zijn objecten, dus als je vergelijkt met ==, vergelijk je referenties in plaats van waarden. De juiste manier is om equals()te gebruiken.

Er is echter een manier. Als u Stringobjecten wilt vergelijken met behulp van de ==operator, kunt u gebruik maken van de manier waarop de JVM omgaat met strings. Bijvoorbeeld:

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

bzou truezijn. Waarom?

Omdat de JVM een tabel met String-constanten heeft. Dus wanneer u letterlijke tekenreeksen gebruikt (aanhalingstekens "), retourneert de virtuele machine dezelfdeobjecten, en daarom retourneert ==true.

Je kunt dezelfde “tabel” gebruiken, zelfs met niet-letterlijke tekenreeksen door de intern()methode. Het retourneert het object dat overeenkomt met de huidige tekenreekswaarde uit die tabel (of plaatst het daar, als dat niet het geval is). Dus:

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

Hieruit volgt dat voor elke twee strings s en t, s.intern() == t.intern() waar is als en slechts als s.equals(t) waar is.


Antwoord 4, autoriteit 5%

Je moet geen stringvergelijkingen doen met ==. Die operator controleert alleen of het dezelfde instantie is, niet dezelfde waarde. Gebruik de .equals-methode om op dezelfde waarde te controleren.


Antwoord 5, autoriteit 5%

U kunt

. gebruiken

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

of

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

De laatste maakt een lexicografischevergelijking, en retourneert 0 als de twee strings hetzelfde zijn.


Antwoord 6, autoriteit 5%

Als je zowel in C++ als in Java codeert, is het beter om te onthouden dat in C++ de tekenreeksklasse de operator == overbelast heeft. Maar niet op Java. je moet daarvoor equals()of equalsIgnoreCase()gebruiken.

Other episodes