2011-10-06 57 views
1

我正在循环访问Parameter对象的集合,正在寻找Parameter.name = "Code"。如果我不能找到它,我默认列表中的第一个参数,如下图所示:Java foreach循环未找到现有列表元素

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 

谁能解释一下到底是怎么回事?

回答

7

的问题是在这里:

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

你大概的意思是说

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

第一个compares the string reference,这是几乎可以肯定不是你想要的。第二个比较字符串的内容

5

你的问题出在下面一行:

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

要检查您必须使用等号字符串相等。

3

您正在比较字符串与==,您应该使用equals()。如果两个字符串都是intern,那么可以将它们与==进行比较,但interned字符串被JVM保留了很长时间,这可能被认为是内存泄漏,并且微优化可能不经常受益。

+0

你永远不应该*实习生自己动手。 (*)对于专家:几乎从不。如果以错误的方式使用它可能会导致内存泄漏。 –

+0

@马克:谢谢,我会重申一下这个答案。 – millimoose