Ответ 1
В вашем примере вы сравниваете строковые объекты, а не их содержимое.
Ваше сравнение должно быть:
if (s.equals("/quit"))
Или если s
string nullity не против/или вам действительно не нравятся NPE:
if ("/quit".equals(s))
Я действительно не знаю, почему инструкция 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
string nullity не против/или вам действительно не нравятся NPE:
if ("/quit".equals(s))
Чтобы сравнить строки для равенства, не использовать ==. Оператор == проверяет, являются ли два объекта точно одним и тем же объектом:
В 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>
String
в java - это объекты, поэтому при сравнении с ==
вы сравниваете ссылки, а не значения. Правильный способ - использовать 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
Из этого следует, что для любых двух строк s и t s.intern() == t.intern() истинно тогда и только тогда, когда s.equals(t) истинно.
Вы можете использовать
if("/quit".equals(s))
...
или
if("/quit".compareTo(s) == 0)
...
Последний делает lexicographic сравнение и возвращает 0, если две строки одинаковы.
Если вы используете код на С++ и Java, лучше помнить, что в С++ класс string имеет перегруженный оператор ==. Но не так на Java. для этого вам нужно использовать equals()
или equalsIgnoreCase()
.
Вы не должны сравнивать строки с ==. Этот оператор проверяет только, является ли он одним и тем же экземпляром, а не тем же значением. Используйте метод .equals для проверки того же значения.