【问题标题】:How to fix Error json.JSONException: Index 1 out of range [0..1)如何修复错误 json.JSONException:索引 1 超出范围 [0..1)
【发布时间】:2019-03-26 06:59:51
【问题描述】:

我的项目从 api 获取公交车票时间信息。但是如果没有服务器返回时间的数据,它不会显示运行时间。这是我通过 Volley 发送请求时的错误消息。

错误 json.JSONException:索引 1 超出范围 [0..1)

代码sn-p

private void sendRequest(final String owner, final Map<String, String> header) {
    StringRequest stringRequest = new StringRequest(Request.Method.POST, MyConstants.URL + owner,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                 //   Log.e("AAAA" + owner, response);
                    try {
                        JSONObject object = new JSONObject(response);
                        if (object.getString(MyConstants.SERVICE_STATUS).equals(MyConstants.SERVICE_RESPONSE_STATUS_NOTAVAILABLE)) {
                            // servisten gelen cevap not_available ise
                            //// owner
                            sendVoyagesErrorBroadcast(owner, MyConstants.ERROR_NOTAVAILABLE);
                        } else if (object.getString(MyConstants.SERVICE_STATUS).equals(MyConstants.SERVICE_RESPONSE_STATUS_SUCCESS)) {
                            JSONArray result = object.getJSONArray(MyConstants.SERVICE_RESULT);
                            JSONArray resultGoing = result.getJSONObject(0).getJSONArray("going");
                            if (has_return) {
                                JSONArray resultReturn = result.getJSONObject(1).getJSONArray("round");
                                sendVoyagesArrayBroadcast(owner + MyConstants.DIRECTION_RETURN, resultReturn);
                            }
                            sendVoyagesArrayBroadcast(owner + MyConstants.DIRECTION_GOING, resultGoing);
                        } else if (object.getString(MyConstants.SERVICE_STATUS).equals(MyConstants.SERVICE_RESPONSE_STATUS_FAİLURE)) {
                            sendVoyagesErrorBroadcast(owner, MyConstants.ERROR_SERVER);
                        }
                    } catch (JSONException e) {
                        Log.e("search" + owner + "VoyagesErr1", e.toString());
                        e.printStackTrace();
                    }
                }

【问题讨论】:

  • 您能否粘贴完整的异常堆栈跟踪,以及引发异常的代码 sn-p,这可能是因为您的结果数组的大小为 1,并且您多次迭代
  • 你的JSON 是什么?您想在索引1 上获取对象,但数组中没有这样的元素。看到这一行:result.getJSONObject(1).
  • @Ravi 这就是轨迹i.hizliresim.com/Ll59oz.jpg
  • @MichałZiober 是的,此索引中没有元素。该指数显示是否有回程巴士。但在这种情况下,有去巴士,没有回程巴士。所以它得到这个错误。

标签: java android json android-volley


【解决方案1】:

请检查以下代码

 if (has_return) {
     JSONArray resultReturn = result.getJSONObject(1).getJSONArray("round");
     sendVoyagesArrayBroadcast(owner + MyConstants.DIRECTION_RETURN, resultReturn);
  }

您正在尝试访问索引 1 处的元素,该元素可能不存在。索引从 0 而不是 1 开始,因此即使结果 json 数组大小为 1 也会出错

尝试做这样的事情

if (has_return) {
    if (result.length() > 1)
        JSONArray resultReturn = result.getJSONObject(1).getJSONArray("round");
        sendVoyagesArrayBroadcast(owner + MyConstants.DIRECTION_RETURN, resultReturn);
    }
}

否则,如果您对第一个元素感兴趣,请像访问它一样访问它

if (result.length() > 0) {
    JSONArray resultReturn = result.getJSONObject(0).getJSONArray("round");
}

【讨论】:

  • 是的,这项工作用于检查数组大小。但我现在有另一个问题。如果 resultGoing 不为 null,则 sendVoyagesBroadcast 必须有效,否则 sendVoyagesErrorBroadcast 必须有效。这对于 resultReturn 也必须相同。我不能为它做真值代码。
  • 在那种情况下应该传递什么数据,你的意思我不清楚
  • 如果这解决了您提出的问题,请将其标记为已接受并提出一个新问题,我们很乐意回答
  • 好的。感谢您的帮助。
  • @Shayma 你能描述一下你现在面临的问题或者你提出的新问题的链接
猜你喜欢
  • 2018-10-01
  • 1970-01-01
  • 2012-09-20
  • 2019-04-06
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多