Цикл foreach Java не находит существующий элемент списка - PullRequest
1 голос
/ 06 октября 2011

Я перебираю коллекцию Parameter объектов, ищу Parameter.name = "Code".Если я не могу его найти, я по умолчанию использую первый параметр в списке, как показано ниже:

    header = WBMessageFactory.getWBMessageDescriptor(Configuration.getWBHeaderIDString());

    for (Parameter p : header.getSegment().getParameter()) {
        if (p.getName() == "Code") {
            String wbCode = raw.substring(p.getStartPosition().intValue(), p.getLength().intValue());
            logger.info("Found WB code... " + wbCode);
            body = WBMessageFactory.getWBMessageDescriptor(wbCode);
            break;  
        }
    }

    if (body == null) {
        Parameter p = header.getSegment().getParameter().get(0);
        logger.error("Could not find Code parameter in Header template, using " + p.getName());
        body = WBMessageFactory.getWBMessageDescriptor(raw.substring(p.getStartPosition().intValue(), p.getLength().intValue()));
    }

Как видите, я регистрирую имя Parameter, когда не могу найти код. Иногда , ведение журнала выявляет следующее:

Could not find Code parameter in Header template, using Code

Кто-нибудь может объяснить, что происходит, черт возьми?

Ответы [ 3 ]

7 голосов
/ 06 октября 2011

Проблема здесь:

 if (p.getName() == "Code") {

Вы, вероятно, хотели сказать

 if (p.getName().equals("Code")) {

Первый сравнивает строковую ссылку , что почти наверняка не то, что вы хотите. Второй сравнивает содержимое строки.

5 голосов
/ 06 октября 2011

Ваша проблема в следующей строке:

if (p.getName() == "Code")

Чтобы проверить равенство строк, вы должны использовать equals.

3 голосов
/ 06 октября 2011

Вы сравниваете строки с ==, вы должны использовать equals(). Если вы intern обеих строк, вы можете сравнить их с ==, но интернированные строки хранятся в JVM в течение длительного времени, что можно считать утечкой памяти, и микрооптимизация, вероятно, не очень часто.

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