Получение E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основная ошибка, я пытаюсь проанализировать файл json, но он выдает ошибку - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь проанализировать JSON с URL http://www.mocky.io/v2/5d94c49c2f000058008ff97c,, но мое приложение продолжает падать, как только я нажимаю на кнопку, чтобы загрузить файл JSON. Я также предоставил разрешение на доступ в Интернет, чтение и запись для внешнего хранилища в файле манифеста.

Logcat ошибка, которую я получаю:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.abc.parsejson, PID: 11141
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:502)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:933)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:933) 
 Caused by: org.json.JSONException: Value kotlin.Unit of type java.lang.String cannot be converted to JSONArray
    at org.json.JSON.typeMismatch(JSON.java:112)
    at org.json.JSONArray.<init>(JSONArray.java:98)
    at org.json.JSONArray.<init>(JSONArray.java:110)
    at com.abc.parsejson.MainActivity$AsyncTaskHandler.jsonResult(MainActivity.kt:70)
    at com.abc.parsejson.MainActivity$AsyncTaskHandler.onPostExecute(MainActivity.kt:64)
    at com.abc.parsejson.MainActivity$AsyncTaskHandler.onPostExecute(MainActivity.kt:33)
    at android.os.AsyncTask.finish(AsyncTask.java:755)
    at android.os.AsyncTask.access$900(AsyncTask.java:192)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7343)

Вот мой код:

class MainActivity : AppCompatActivity() {


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val url = findViewById<EditText>(R.id.editText).text


    var load = findViewById<Button>(R.id.button)

    load.setOnClickListener {
        AsyncTaskHandler().execute(url.toString())
    }

}

inner class AsyncTaskHandler:AsyncTask<String,Int,String>() {

    override fun onPreExecute() {
        super.onPreExecute()
        findViewById<ProgressBar>(R.id.loader).visibility = View.VISIBLE
    }

    override fun doInBackground(vararg p0: String?): String {

        return try {
            p0.first().let {
                val url = URL(it)
                val urlConnect = url.openConnection() as HttpURLConnection
                urlConnect.connectTimeout = 700
                publishProgress(100)
                urlConnect.inputStream.bufferedReader().readText()

            }
        } catch (e: Exception) {
            p0.first().let {
                val url = URL(it)
                val urlConnect = url.openConnection() as HttpURLConnection
                urlConnect.disconnect().toString()
            }
        }
    }

    override fun onPostExecute(result: String?) {
        super.onPostExecute(result)
        findViewById<ProgressBar>(R.id.loader).visibility = View.GONE

        jsonResult(result)
        Log.d("Fetched Data", result)

    }

    private fun jsonResult(jsonString: String?){
        val jsonArray = JSONArray(jsonString)
        val list=ArrayList<MyData>()
        var i = 0

        while(i<jsonArray.length()){
            val jsonObject=jsonArray.getJSONObject(i)
            list.add(
                MyData(
                    jsonObject.getString("author"),
                    jsonObject.getString("photo")
                )
            )
            i++
        }

        val adapter = ListAdapter(this@MainActivity,list)
        val listView = findViewById<ListView>(R.id.listView)
        listView.adapter = adapter

    }



}

}

1 Ответ

0 голосов
/ 13 октября 2019

jsonString здесь имеет значение null, поэтому его нельзя преобразовать в JSONArray -

private fun jsonResult(jsonString: String?){

Прежде всего добавьте проверку NULL перед преобразованием ее в JSONArray, а также переместите весь код анализа в блок try catch -

private fun jsonResult(jsonString: String?){
      if(jsonString != null){
        try{
        val jsonArray = JSONArray(jsonString)
        val list=ArrayList<MyData>()
        var i = 0

        while(i<jsonArray.length()){
            val jsonObject=jsonArray.getJSONObject(i)
            list.add(
                MyData(
                    jsonObject.getString("author"),
                    jsonObject.getString("photo")
                )
            )
            i++
        } 
       }catch(e: JSONException){
         Log.d("TAG", "Exc $e.message")
       }
      }

        val adapter = ListAdapter(this@MainActivity,list)
        val listView = findViewById<ListView>(R.id.listView)
        listView.adapter = adapter

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...