2014-02-12 73 views
1

我知道,對於你們許多人來說,這可能是一個愚蠢的問題,但我正在學習android/java,我仍然有一些概念不清楚。返回聲明與try/catch

在這種情況下,我不確定在try/catch塊中使用return語句的最佳方式是什麼。

這是怎麼了我宣佈我的方法,我需要用這個:

public JSONArray parseXmlResponse(String response) { 

     JSONArray addressComp = null; 
     JSONObject jsonObject = new JSONObject(); 

     try { 
      jsonObject = new JSONObject(response); 
      addressComp = jsonObject.getJSONArray("results").getJSONObject(0).getJSONArray("address_components"); 
     }catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return addressComp; 
    } 

據我所知,這裏的方法總是返回「addressComp」,即使它是空的。
但我見過,其他人會做在這個另一種方式:

public JSONArray parseXmlResponse(String response) { 

     JSONArray addressComp = null; 
     JSONObject jsonObject = new JSONObject(); 

     try { 
      jsonObject = new JSONObject(response); 
      addressComp = jsonObject.getJSONArray("results").getJSONObject(0).getJSONArray("address_components"); 
      return addressComp; 
     }catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

但是,這讓我有點糊塗了。
通過在這裏設置return null不會將值設置爲始終爲null,即使addressComp具有實際值嗎?

+1

如果沒有發生異常,則返回在'try'塊的末尾發生。此時'addressComp'被返回,它不是null。 – Petter

+0

'返回null;'是無法訪問的代碼。 – Maroun

+0

@Petter所以,如你所說,如果沒有發生異常並且它通過try塊,它將返回try塊中的內容並跳過返回null值 – masmic

回答

3

設置返回null那裏不會設置返回值始終爲null即使addressComp有實數值嗎?

沒有,一旦它遇到第一個return聲明將return addressCompreturn null線將永遠不會被執行。只要確保你檢查null上正在採取該值的變量,如果它會導致問題。

編輯

JSONArray jArray = parseXmlResponse(someString); 
if (jArray != null) 
{ 
    //run some code 
} 
else 
{ 
    //it's null so run some other code 
} 
+0

好的,接下來的事情應該是設置另一個try/catch塊來捕獲變量帶有ta值的NULLPOINTEREXCEPTION,對吧? – masmic

+0

它不一定需要成爲try/catch塊。讓我用一個簡短的例子編輯 – codeMagic

1

這些方法基本上實現同樣的事情。在第二種方式,它只會達到return語句...

return addressComp; 

...如果它在try塊中的所有內容都很好,並且不會引發異常。一旦這個命中,該方法就完成了,沒有更多的代碼被執行,所以它不會達到空返回。

但是,如果在try塊中出現問題,它會去捕獲,打印堆棧跟蹤,然後程序流將落入try catch塊並返回null值。請注意,一旦拋出異常,try塊中的NOTHING將被運行。

第二種方法稍微好一點,因爲您至少可以報告問題。如果使用第一種方法,則在繼續之前,您需要檢查返回的值是否爲空。