繁体   English   中英

获取 E/AndroidRuntime: FATAL EXCEPTION: main error, 我正在尝试解析 json 文件,但它抛出错误

[英]Getting E/AndroidRuntime: FATAL EXCEPTION: main error, I am trying to parse json file but it'ss throwing error

I am trying to parse JSON from URL http://www.mocky.io/v2/5d94c49c2f000058008ff97c , but my app keeps crashing once I click on the button to load JSON file. 我还提供了对清单文件的外部存储的 Internet 访问权限、读写权限。

我得到的 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

    }



}

}

jsonString 在这里是 null 所以它不能被转换成 JSONArray -

private fun jsonResult(jsonString: String?){

首先,在将其转换为 JSONArray 之前添加一个 null 检查,并将所有解析代码移动到 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

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM