【问题标题】:Getting a NullPointerException while parsing JSON解析 JSON 时获取 NullPointerException
【发布时间】:2015-04-11 06:03:04
【问题描述】:

在我看来一切都是正确的:获取结果对象、获取系列数组、获取索引处的对象以及获取数据数组。

private void downloadAllData() throws JSONException {

    queryApi();

    JSONObject results = mJsonResponse.getJSONObject("Results"); // NullPointerException here
    JSONArray seriesArray = results.getJSONArray("series");

    JSONObject DataSeries1 = seriesArray.getJSONObject(0);
    JSONArray DataArray1 = DataSeries.getJSONArray("data");

    JSONObject DataSeries2 = seriesArray.getJSONObject(1);
    JSONArray DataArray2 = DataSeries.getJSONArray("data");

JSON 提要:

{"status":"REQUEST_SUCCEEDED","responseTime":36,"message":[],"Results":{
"series":
[{"seriesID":"431432","data":[{"year":"1977","period":"M12","periodName":"December","value":"160.7","footnotes":[{}]},{"year":"1977","period":"M11","periodName":"November","value":"161.3","footnotes":[{}]},{"year":"1977","period":"M10","periodName":"October","value":"162.2","footnotes":[{}]},{"year":"1977","period":"M09","periodName":"September","value":"162.5","footnotes":[{}]},{"year":"1977","period":"M08","periodName":"August","value":"163.4","footnotes":[{}]},{"year":"1977","period":"M07","periodName":"July","value":"164.0","footnotes":[{}]},{"year":"1977","period":"M06","periodName":"June","value":"164.6","footnotes":[{}]},{"year":"1977","period":"M05","periodName":"May","value":"165.8","footnotes":[{}]},{"year":"1977","period":"M04","periodName":"April","value":"166.7","footnotes":[{}]},{"year":"1977","period":"M03","periodName":"March","value":"167.9","footnotes":[{}]},{"year":"1977","period":"M02","periodName":"February","value":"169.1","footnotes":[{}]},{"year":"1977","period":"M01","periodName":"January","value":"170.6","footnotes":[{}]}]},
{"seriesID":"321432","data":[{"year":"1977","period":"M12","periodName":"December","value":"50.5","footnotes":[{}]},{"year":"1977","period":"M11","periodName":"November","value":"50.4","footnotes":[{}]},{"year":"1977","period":"M10","periodName":"October","value":"50.5","footnotes":[{}]},{"year":"1977","period":"M09","periodName":"September","value":"50.6","footnotes":[{}]},{"year":"1977","period":"M08","periodName":"August","value":"50.6","footnotes":[{}]},{"year":"1977","period":"M07","periodName":"July","value":"50.6","footnotes":[{}]},{"year":"1977","period":"M06","periodName":"June","value":"50.5","footnotes":[{}]},{"year":"1977","period":"M05","periodName":"May","value":"50.1","footnotes":[{}]},{"year":"1977","period":"M04","periodName":"April","value":"49.4","footnotes":[{}]},{"year":"1977","period":"M03","periodName":"March","value":"48.8","footnotes":[{}]},{"year":"1977","period":"M02","periodName":"February","value":"48.3","footnotes":[{}]},{"year":"1977","period":"M01","periodName":"January","value":"47.6","footnotes":[{}]}]}]
}}

Logcat:

04-10 22:16:59.519  10910-10937/com.learn.kent.mojito E/AndroidRuntime﹕ FATAL EXCEPTION: IntentService[DownloadService]
    Process: com.learn.kent.mojito, PID: 10910
    java.lang.NullPointerException
            at com.learn.kent.mojito.service.DownloadService.downloadAllData(DownloadService.java:151)
            at com.learn.kent.mojito.service.DownloadService.onHandleIntent(DownloadService.java:83)
            at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:212)
            at android.os.HandlerThread.run(HandlerThread.java:61)

04-10 22:16:59.659  10910-10910/com.learn.kent.mojito D/OpenGLRenderer﹕ 
Enabling debug mode 0
04-10 22:16:59.729  10910-10910/com.learn.kent.mojito I/ActivityManager﹕ Timeline: Activity_idle id: android.os.BinderProxy@42db38a8 time:59558459
04-10 22:17:00.369  10910-10910/com.learn.kent.mojito D/DownloadService﹕ {"Results":{"series":[{"data":[{"value":"50.5","year":"1977","period":"M12","footnotes":[{}],"periodName":"December"},{"value":"50.4","year":"1977","period":"M11","footnotes":[{}],"periodName":"November"},{"value":"50.5","year":"1977","period":"M10","footnotes":[{}],"periodName":"October"},{"value":"50.6","year":"1977","period":"M09","footnotes":[{}],"periodName":"September"},{"value":"50.6","year":"1977","period":"M08","footnotes":[{}],"periodName":"August"},{"value":"50.6","year":"1977","period":"M07","footnotes":[{}],"periodName":"July"},{"value":"50.5","year":"1977","period":"M06","footnotes":[{}],"periodName":"June"},{"value":"50.1","year":"1977","period":"M05","footnotes":[{}],"periodName":"May"},{"value":"49.4","year":"1977","period":"M04","footnotes":[{}],"periodName":"April"},{"value":"48.8","year":"1977","period":"M03","footnotes":[{}],"periodName":"March"},{"value":"48.3","year":"1977","period":"M02","footnotes":[{}],"periodName":"February"},{"value":"47.6","year":"1977","period":"M01","footnotes":[{}],"periodName":"January"}],"seriesID":"21432"},{"data":[{"value":"62.1","year":"1977","period":"M12","footnotes":[{}],"periodName":"December"},{"value":"61.9","year":"1977","period":"M11","footnotes":[{}],"periodName":"November"},{"value":"61.6","year":"1977","period":"M10","footnotes":[{}],"periodName":"October"},{"value":"61.4","year":"1977","period":"M09","footnotes":[{}],"periodName":"September"},{"value":"61.2","year":"1977","period":"M08","footnotes":[{}],"periodName":"August"},{"value":"61.0","year":"1977","period":"M07","footnotes":[{}],"periodName":"July"},{"value":"60.7","year":"1977","period":"M06","footnotes":[{}],"periodName":"June"},{"value":"60.3","year":"1977","period":"M05","footnotes":[{}],"periodName":"May"},{"value":"60.0","year":"1977","period":"M04","footnotes":[{}],"periodName":"April"},{"value":"59.5","year":"1977","period":"M03","footnotes":[{}],"periodName":"March"},{"value":"59.1","year":"1977","period":"M02","footnotes":[{}],"periodName":"February"},{"value":"58.5","year":"1977","period":"M01","footnotes":[{}],"periodName":"January"}],"seriesID":"431432"}]},"message":[],"status":"REQUEST_SUCCEEDED","responseTime":44}
04-10 22:17:01.489  10910-10937/com.learn.kent.mojito I/Process﹕ Sending signal. PID: 10910 SIG: 9

logcat 中的 JSON 响应表示 log.d(TAG, mJsonResponse.tostring)

使用 Volley 初始化 mJsonResponse:

private void queryApi() throws JSONException {
        try {
            jsonObjectQuery.put("seriesid", seriesid);
            jsonObjectQuery.put("startyear", "" + startYear);
            jsonObjectQuery.put("endyear", "" + endYear);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        JsonObjectRequest jsonObjRequest = new JsonObjectRequest(Request.Method.POST, url,
                jsonObjectQuery, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                mJsonResponse = response; <--------------------------------
                Log.d(TAG, mJsonResponse.toString());
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            }
        }) {

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Content-Type", "application/json; charset=utf-8");
                return headers;
            }
        };
        queue.add(jsonObjRequest);
    }

【问题讨论】:

  • 发布你的日志。尝试将它们放在try-catch 块中
  • DownloadService.java 源代码的第 151 行指向哪一行?
  • 你发起mJsonResponse了吗?
  • 不能调试吗? mJsonResponse null
  • 扩展了 logcat。 mJsonResponse 在我的 log.d 上不为空

标签: java android json


【解决方案1】:

async task 导致了这个错误。您必须确保在JSONObject results = mJsonResponse.getJSONObject("Results"); 之前调用mJsonResponse = response;
喜欢:

public void onResponse(JSONObject response) {
    mJsonResponse = response; <--------------------------------
    Log.d(TAG, mJsonResponse.toString());
    JSONObject results = mJsonResponse.getJSONObject("Results"); // NullPointerException here
    JSONArray seriesArray = results.getJSONArray("series");

    JSONObject DataSeries1 = seriesArray.getJSONObject(0);
    JSONArray DataArray1 = DataSeries.getJSONArray("data");

    JSONObject DataSeries2 = seriesArray.getJSONObject(1);
    JSONArray DataArray2 = DataSeries.getJSONArray("data");
}

【讨论】:

  • @Pwnies 是的,这可能是一个案例。
  • 轰隆隆。问题已解决,感谢 SilentKnight。我必须添加到您的答案中的唯一内容是 try-catch 块。
【解决方案2】:

这样做:

private JSONObject queryApi() {
    //your code  
    return mJsonResponse;
}

mJsonResponse = queryApi();

【讨论】:

  • 这让我有点狭隘了,所以我认为它绝对值得一票。
【解决方案3】:
JSONObject DataSeries1 = seriesArray.getJSONObject(0);
JSONArray DataArray1 = DataSeries1.getJSONArray("data");

JSONObject DataSeries2 = seriesArray.getJSONObject(1);
JSONArray DataArray2 = DataSeries2.getJSONArray("data");

试试它对我的工作

【讨论】:

  • 更改 DataSeries.getJSONArray("data");到 DataSeries1.getJSONArray("data");
猜你喜欢
  • 2014-03-06
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2018-05-20
相关资源
最近更新 更多