2011-10-06 28 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