2016-12-01 72 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显示未处理的异常错误的原因。