以下の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");
}
}
}
}
}
この例では、コンテンツではなく文字列オブジェクトを比較しています。
比較する必要があります:
if (s.equals("/quit"))
または、s
文字列のnullityが気にならない場合、またはNPEが本当に気に入らない場合:
if ("/quit".equals(s))
ストリングの等価性を比較するには、==を使用しないでください。 ==演算子は、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>
JavaのString
sはオブジェクトであるため、==
と比較する場合、値ではなく参照を比較しています。正しい方法は、equals()
を使用することです。
ただし、方法があります。 ==
演算子を使用してString
オブジェクトを比較する場合、JVMが文字列を処理する方法を利用できます。例えば:
String a = "aaa";
String b = "aaa";
boolean b = a == b;
b
はtrue
になります。どうして?
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です。
==を使用して文字列を比較しないでください。その演算子は、同じ値ではなく、同じインスタンスであるかどうかを確認するだけです。 .equalsメソッドを使用して、同じ値を確認します。
Javaと同様にC++でコーディングする場合、C++では、文字列クラスに==演算子がオーバーロードされていることに注意することをお勧めします。しかし、Javaではそうではありません。そのためにequals()
またはequalsIgnoreCase()
を使用する必要があります。
使用できます
if("/quit".equals(s))
...
または
if("/quit".compareTo(s) == 0)
...
後者は 辞書式 比較を行い、2つの文字列が同じ場合は0を返します。