开发者

Java foreach loop not finding existing list element

I am looping through a collection of Parameter objects, looking for Parameter.name = "Code". If I can't find it I default to the first Parameter in the list, as below:

    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()));
    }

As you can see, I log the Parameter name when I can't find Code. Occasionally,开发者_如何学Go logging reveals the following:

Could not find Code parameter in Header template, using Code

Can anyone explain what the heck is going on?


The problem is here:

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

You probably meant to say

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

The first one compares the string reference, which is almost certainly not what you want. The second one compares the contents of the string.


Your problem is in the following line:

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

To check for String equality you have to use equals.


You're comparing the strings with ==, you should use equals(). If you intern both of the strings, you could compare them with ==, but interned Strings are retained by the JVM for a long time which could be considered a memory leak, and the microoptimisation probably isn't of benefit very often.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜