Как я могу попытаться поймать val в данных выборки успешно? - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь получить «изображение» JSONObject, которое иногда является нулевым значением, поэтому я установил try {} catch {} для моего val jsonMedia, чтобы сделать его обнуляемым, но я не уверен, что что-то упустил, потому что это не похоже на работу.

Всякий раз, когда я закомментирую jsonMedia, моя выборка работает нормально, поэтому я сосредоточусь на том, чтобы просто поделиться выборкой "изображения", чтобы данные, которыми я делюсь, не запутались.

первый. Я покажу, как «изображение» находится в базе данных и что я подразумеваю под «иногда», имеет нулевое значение - ноль:

{
    "listCar": [
   {
    //other data
    "image": null,
    //other data
   }
 ]
}
  • , когда оно содержит изображение:
{
    "listCar": [
   {
    //other data
     "image": {
                "path": "Upload/UploadCarMain/UploadCarMain-200-200/30032235992008220498istanbul_adalarCar195.jpg",
                "name": "30032235992008220498istanbul_adalarCar195.jpg"
            },
    //other data
   }
 ]
}

Теперь за моими данными выборки последовал курс, за которым я наблюдаю, единственное отличие состоит в том, что значения «image» в базе данных, которую я использую, не похожи на курс, который не содержит нулевых значений в их image path

Теперь вот мой "Автомобиль" class, который должен получить изображение:

class Car(other data, val image: String?, other data) {
    override fun toString(): String {
        return "Car(//other data, image='$image', //other data')"
    }
}

, а вот мой код извлечения, где я пытаюсь try {} catch(){} мой "jsonMedia" image JSONOBject:

override fun doInBackground(vararg params: String?): ArrayList<Car> {
        Log.d(TAG, "doInBackground starts")

        val carList = ArrayList<Car>()
        try {
            val jsonData = JSONObject(params[0])
            val itemsArray = jsonData.getJSONArray("listCar")

            for (i in 0 until itemsArray.length()) {
                val jsonCar = itemsArray.getJSONObject(i)
                //other fetch data

                val jsonMedia: JSONObject? = try {jsonCar.getJSONObject("image")} catch (e: IllegalArgumentException) {null}
                val photoURL = jsonMedia?.getString("path")

                val carObject = Car(other data, photoURL)

                carList.add(carObject)
                Log.d(TAG, ".doInBackground $carObject")
            }
        } catch (e: JSONException) {
            e.printStackTrace()
            Log.e(TAG, "doInBackground: Error processing json data. ${e.message}")
            cancel(true)
            listener.onError(e)
        }

        Log.d(TAG, ".doInBackground ends")
        return carList
    }

    override fun onPostExecute(result: ArrayList<Car>) {
        Log.d(TAG, "onPostExecute starts")
        super.onPostExecute(result)
        listener.onDataAvailable(result)
        Log.d(TAG, ".onPostExecute ends")
    }
}

и вот ошибка, которую я получаю, когда запускаю код:

2020-02-14 16:42:16.483 26642-26684/com.example.wasit E/GetFlickrJsonData: doInBackground: Error processing json data. Value null at image of type org.json.JSONObject$1 cannot be converted to JSONObject

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Я нашел способ.

Мне пришлось обернуть мою "jsonMedia" в следующую попытку catch:

val jsonMedia: JSONObject? = try {jsonCar.getJSONObject("image")} catch (e: JSONException) {
                    null
                }

Теперь мои изображения, которые имеют нулевое значение, содержат заполнители, а остальные работают нормально !

0 голосов
/ 14 февраля 2020

Просто измените код следующим образом. Класс исключений является родительским классом всех исключений и предоставляет точную причину ошибки.

for (i in 0 until itemsArray.length()) {

try {

                val jsonCar = itemsArray.getJSONObject(i)
                //other fetch data

                val jsonMedia: JSONObject? = jsonCar.getJSONObject("image")
                val photoURL = jsonMedia?.getString("path")

                val carObject = Car(other data, photoURL)

                carList.add(carObject)

} catch (ex: Exception) {
 Log.d(TAG, ex.localizedMessage.toString())
}

            }
...