2014-07-04 57 views
0

以下Java代碼在Android中無法按預期工作,無論它是使用JDK 1.6還是1.7編譯的。當「if語句」被評估爲true時,「found被賦值給變量mState,但是下一個語句」return ext;「沒有被執行,而是執行了最後一個語句」return null;「。之前被銷燬,以執行「返回null;」聲明Java for-each循環內循環返回不按預期方式工作

String mState = null; 
for (PacketExtension ext : packetExtensions) { 
    if (elementName.equals(ext.getElementName()) && namespace.equals(ext.getNamespace())) 
    { 
     mState = "found"; 
     return ext; 
    } 
} 
return null; 

我也嘗試如下重新編碼,但正如前面也面臨着同樣的問題

PacketExtension ext = null; 
for (Iterator<PacketExtension> iterator = packetExtensions.iterator(); iterator.hasNext();) { 
    ext = iterator.next(); 
    if (elementName.equals(ext.getElementName()) && namespace.equals(ext.getNamespace()) 
    { 
     return ext; 
    } 
] 
return null; 

以下修改後的代碼是。即使我試圖在「if語句」爲true時將ext分配給新的局部變量ext2,並將「return null;」更改爲「return ext2;」,ext2也是ge在「返回ext2」之前銷燬,而新方法也無法正常工作。欣賞一些專家的建議。

PacketExtension ext = null; 
PacketExtension ext2 = null; 

for (Iterator<PacketExtension> iterator = packetExtensions.iterator(); iterator.hasNext();) { 
    ext = iterator.next(); 
    if (elementName.equals(ext.getElementName()) && namespace.equals(ext.getNamespace()) 
    { 
     ext2 = ext; 
     break; 
    } 
] 
return ext2; 
+0

我會在if語句中加入一個print語句來驗證這段代碼是否正在使用 –

+0

您確定if語句的計算結果爲true嗎?因爲如果它,你的代碼應該工作。這將有助於查看包含此代碼的完整方法。 – Eran

回答

0

如果通過「下一條語句」return ext;「未被執行。你的意思是說,當與調試器一起步時,「當前語句」指示器進入第二個返回狀態,這只是Android使用Eclipse進行調試的一個問題。

只要方法中有多個出口點,它就會顯示在最後一個點上。但是,結果是正確的,您可以通過跳出調用方法並驗證返回的值來檢查該結果。

-1
String mState = null; 
PacketExtension ext = null; 

for (PacketExtension ext : packetExtensions) { 
    if (elementName.equals(ext.getElementName()) && namespace.equals(ext.getNamespace())) 
    { 
     mState = "found"; 
     this.ext = ext; 
     break; 
    } 
} 
return ext; 
+0

你是對的,雖然在eclipse下的跟蹤似乎顯示執行跳轉到「return null;」,但實際的ext對象正在被正確重新調用。 這是我自己的錯誤;整個問題是由於ClassCastException發生在我試圖返回的對象上,但是不正確的強制轉換。我錯誤地認爲null返回導致我的應用程序中止。 對我粗心的錯誤有很多意見。 – user3803741