Почему не работает сравнение строк? - PullRequest
7 голосов
/ 07 октября 2009

Хорошо, это глупо, но что происходит?

У меня есть переменная String в сервлете, которая принимает значение параметра и на основании этого значения я делаю тест, чтобы что-то сделать, но if не работает. В чем проблема?

 String action = request.getParameter("action");
    System.out.println("Action: " + action);
// I put 2 ifs to be sure, but not even one is working
    if(action.equals("something"))
            {
                System.out.println("hey");            
            }
    if(action.trim() == "something")
            {
                System.out.println("hey");
            }

На консоли System.out.println показывает мне, что значение действия равно «что-то»

Action: something

Ответы [ 8 ]

37 голосов
/ 07 октября 2009

Ваше второе сравнение неверно. Вы также должны использовать equals вместо ==, например:

if (action.trim().equals("something"))

Оператор == сравнивает ссылки объектов (String) и при нормальных обстоятельствах равно строки не имеют автоматически одинаковые ссылки, то есть они являются разными объектами. (Если оба не усвоены , но обычно вы не должны это учитывать)

Кроме того, ваш пример работает нормально, и первое сравнение допустимо. Попробуйте исправить второе сравнение. Если это работает, вы нашли свою проблему. Если нет, попробуйте использовать отладчик и перепроверьте все.

PS: при сравнении литеральных строк с динамическими строковыми объектами рекомендуется вызывать метод equals для литеральной строки:

"something".equals(action)

Таким образом, вы можете избежать исключений NullPointerException, когда строковый объект имеет значение null.

9 голосов
/ 07 октября 2009

Ваше второе условие вряд ли когда-либо будет выполнено - вы проверяете, является ли строковый объект, созданный усечением action, тем же объектом, что и строковый литерал "something". Это будет верно только в том случае, если action установлено в то же самое буквальное значение в другом месте. Вместо этого используйте "something".equals( action.trim() ).

Ваше первое условие будет истинным, символы в строке action являются символами "something". Если это не правда, то это не так. Подтвердите это в тесте, зарегистрируйте его, распечатайте или посмотрите на него в отладчике.

Если вы печатаете строку для отладки, используйте что-то вроде System.out.println ( "String = >" + string + "<" );, чтобы было очевидно, есть ли пробелы в конце.

4 голосов
/ 07 октября 2009

Сравнение строк в Java не может быть выполнено ==.

Вы должны использовать String.equals() или String.compareTo() -

Кстати, String.compareTo() возвращает 0, тогда как String.equals() возвращает true, когда две строки равны.

См: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#equals(java.lang.Object)

1 голос
/ 07 октября 2009

Вы можете лучше защитить от нулевых значений, переключая предложения if, чтобы сначала был строковый литерал.

Но так как вы, похоже, также хотите защитить от пробелов в значении параметра, вы также можете выполнить нулевую безопасную обрезку значения параметра, используя StringUtils.trimToEmpty из Apache Commons Lang :

String action = StringUtils.trimToEmpty(request.getParameter("action"));

System.out.println("Action: " + action);

if("something".equals(action)) {
   System.out.println("hey");            
}
1 голос
/ 07 октября 2009

Я предполагаю, что у вас есть пробелы в конце или в начале, которые не отображаются в println.

Объедините это с фактом, что вы используете action.trim() == 'something', что означает, что этот тест также не будет работать.

Переключите это на .equals("something"), как предлагают другие, и это может сработать.

0 голосов
/ 25 октября 2010

попробуйте это:

String action = request.getParameter("action");
System.out.println("Action: " + action);

if(action.trim().equals("something"))
{
    System.out.println("hey");            
}
0 голосов
/ 07 октября 2009

Просто дикое предположение: может быть, что одно из этих «чего-то» содержит, например, кириллический символ, который выглядит идентично своему латинскому аналогу. В этом случае это может быть «o».

0 голосов
/ 07 октября 2009

Метод equals сравнивает строки для идентификации объекта и сравнивает не содержимое. Чтобы сравнить содержимое двух строк, используйте метод compareTo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...