web-dev-qa-db-ja.com

文字列比較を伴うステートメントが失敗した場合

以下のifステートメントが実行されない理由は本当にわかりません。

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

以下はクラス全体です。

それはおそらく本当に愚かな論理問題ですが、私はこれを理解することができずにここで髪を引っ張っていました。

見てくれてありがとう:)

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

この例では、コンテンツではなく文字列オブジェクトを比較しています。

比較する必要があります:

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

または、s文字列のnullityが気にならない場合、またはNPEが本当に気に入らない場合:

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

ストリングの等価性を比較するには、==を使用しないでください。 ==演算子は、2つのオブジェクトがまったく同じオブジェクトであるかどうかを確認します。

Javaには、多くの文字列比較があります。

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

JavaのStringsはオブジェクトであるため、==と比較する場合、値ではなく参照を比較しています。正しい方法は、equals()を使用することです。

ただし、方法があります。 ==演算子を使用してStringオブジェクトを比較する場合、JVMが文字列を処理する方法を利用できます。例えば:

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

btrueになります。どうして?

JVMにはString定数のテーブルがあるためです。したがって、文字列リテラル(引用符")を使用すると、仮想マシンは同じオブジェクトを返すため、==trueを返します。

intern() メソッドを使用すると、非リテラル文字列でも同じ「テーブル」を使用できます。そのテーブルから現在の文字列値に対応するオブジェクトを返します(そうでない場合はそこに置きます)。そう:

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

したがって、2つの文字列sおよびtについて、s.equals(t)がtrueの場合にのみ、s.intern()== t.intern()はtrueです。

11
Bozho

==を使用して文字列を比較しないでください。その演算子は、同じ値ではなく、同じインスタンスであるかどうかを確認するだけです。 .equalsメソッドを使用して、同じ値を確認します。

4
digitaljoel

Javaと同様にC++でコーディングする場合、C++では、文字列クラスに==演算子がオーバーロードされていることに注意することをお勧めします。しかし、Javaではそうではありません。そのためにequals()またはequalsIgnoreCase()を使用する必要があります。

4
user855

使用できます

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

または

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

後者は 辞書式 比較を行い、2つの文字列が同じ場合は0を返します。

4
littleduckie