Причина: org.json.JSONException: индекс 2 вне диапазона [0..2) Ошибка запроса залпа

Я знаю, что есть несколько других тем по той же теме, но я еще не решил свою проблему, поэтому мне нужна помощь, если это возможно. Я пытаюсь отправить запрос GET в API, используя залп в Android. Мой код котлина показан ниже:

 val requestQueue = Volley.newRequestQueue(c)
    val sharedPref = c.getSharedPreferences(SHARED_PREFS, MODE_PRIVATE).getString(TEXT, "")
    Log.i("EDITTT", sharedPref)
    var  jsonArrayRequest = object : JsonArrayRequest(Request.Method.GET, url, null,
            Response.Listener { response ->
                var jsonArray: JSONArray = response
                for (item in 0..jsonArray.length()) {
                    var bookObject: JSONObject = jsonArray.getJSONObject(item)
                    var title: String = bookObject.getString("title")
                    var author: String = bookObject.getString("author")
                    var publisher: String = bookObject.getString("publisher")
                    var date : String = bookObject.getString("date")
                    var bookItem: BookItem = BookItem(title, author, publisher)
                    bookData.add(bookItem)
                    println(bookData)
                }
                liveBookData.setValue(bookData)

            },
            Response.ErrorListener { error ->
                Log.i("ERRORRR", error.toString())
            })
    {
        @Throws(AuthFailureError::class)
        override fun getHeaders(): Map<String, String> {
            val headers = HashMap<String, String>()
            headers.put("Authorization", "$sharedPref");
            return headers
        }
    }

И я получаю эту ОШИБКУ: Вызвано: org.json.JSONException: Индекс 2 вне диапазона [0..2) Если у вас есть какие-либо предложения, сообщите мне об этом. Спасибо!


person Razvan Andrei    schedule 05.08.2020    source источник


Ответы (1)


Проблема в том, что for (item in 0..jsonArray.length()) является инклюзивным диапазоном, а это означает, что если длина jsonArray равна 2 (как в вашем случае), он будет повторяться 3 раза: позиции 0, 1 и 2.

Попробуйте вместо этого использовать until, то есть for (item in 0 until jsonArray.length()). Разница в том, что until не включает последний элемент, поэтому он зациклится только 2 раза: позиции 0 и 1.

Дополнительную информацию можно найти в официальной документации: https://kotlinlang.org/docs/reference/ranges.html#ranges-and-progressions

person user2340612    schedule 05.08.2020