2016-12-01 69 views
0

我試圖解析一個簡單的JSON字符串Android的 - 解析JSON字符串

try { 
     String candyJson = "{\"candies\":[ {\"name\":\"Jelly Beans\", \"count\":10}, {\"name\":\"Butterscotch\", \"count\":6}]}"; 
     JSONObject candiesJSONobject = new JSONObject(candyJson); 
     JSONArray candiesJSONarray = candiesJSONobject.getJSONArray("candies"); 
     Log.v("JSONObject", candiesJSONarray.getJSONObject(0).getString("name")); 
    } catch (JSONException e){ 
     Log.e("MYAPP", e.toString()); 
    } 

的代碼,而無需在Android日誌捕獲任何異常,並打印JSONObject的名字在這種狀態下正常工作。

然而當我不要試圖捕捉的異常,如下面的例子:

 String candyJson = "{\"candies\":[ {\"name\":\"Jelly Beans\", \"count\":10}, {\"name\":\"Butterscotch\", \"count\":6}]}"; 
     JSONObject candiesJSONobject = new JSONObject(candyJson); 
     JSONArray candiesJSONarray = candiesJSONobject.getJSONArray("candies"); 
     Log.v("JSONObject", candiesJSONarray.getJSONObject(0).getString("name")); 

Android的工作室給了我所有的JSON方法未處理的異常錯誤。解析JSON時是否需要捕獲JSONException或者我做錯了什麼?

+1

先閱讀「異常處理」。 –

+0

你的json結構不正確。無效的json。 http://jsonviewer.stack.hu/ –

+0

JSON字符串工作正常。我使用反斜槓來轉義引號。 – Asym

回答

3

這實際上是Java功能:-)請閱讀更多關於它的信息here

的理念是 - 如果一個方法說,它會拋出一個(非運行時)異常,該方法的所有調用都是需要捕獲此異常,以防萬一

這並不意味着你在你的代碼中得到這個異常,你只能看到當你真正運行它。但是Java需要你爲導致這種異常的情況做好準備。

+0

非常感謝!該鏈接非常有幫助! – Asym

+0

如果它回答你的問題,請將答案標記爲正確:-) – Kelevandos

+0

我必須等待4分鐘才能接受答案。將盡快完成。 – Asym

1

那麼,既然你正在使用org.json ... json對象,是的,他們的大多數方法都會拋出必須捕獲和處理的異常。

但是,如果你不想處理它自己的每個異常,我建議你創建一個json utils類,它將爲你處理這些事情。

例如,對於JSONObject的構造可以使你自己的方法,像這樣

public static JSONObject createObjectFromString(String objectString) { 
    try { 
     return new JSONObject(objectString); 
    } catch (JSONException e) { 
     Log.e("MYAPP", e.toString()); 
    } 
} 

,當你想創建一個新的JSON對象,只是重複使用此方法。

0

是的,如果有任何方法拋出異常,你需要捕獲該異常。 這稱爲檢查異常編譯時例外

在你的情況的方法,如

JsonArray getJsonArray(String name) 

JsonObject getJsonObject(String name) 

檢查這裏http://docs.oracle.com/javaee/7/api/javax/json/JsonObject.html#getJsonArray-java.lang.String-

ClassCastException讓你無論是將其接住或拋出異常。拋出異常將導致應用程序崩潰,所以更好地抓住它。

0

如果任何方法拋出checked checked,那麼調用者可以通過捕獲它來處理這個異常,或者可以通過在方法聲明中聲明另一個throws子句來拋出它。

這就是Android Studio顯示未處理的異常錯誤的原因。