【问题标题】:Getting E/AndroidRuntime: FATAL EXCEPTION: main error, I am trying to parse json file but it'ss throwing error获取 E/AndroidRuntime: FATAL EXCEPTION: main error, 我正在尝试解析 json 文件但它抛出错误
【发布时间】:2019-10-13 16:01:13
【问题描述】:

我正在尝试从 URL http://www.mocky.io/v2/5d94c49c2f000058008ff97c 解析 JSON,但是一旦我单击按钮加载 JSON 文件,我的应用程序就会不断崩溃。我还提供了对清单文件的外部存储的 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

    }



}

}

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    jsonString 此处为空,因此无法转换为 JSONArray -

    private fun jsonResult(jsonString: String?){
    

    首先在将其转换为 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
    
        }
    

    【讨论】:

      猜你喜欢
      • 2020-03-03
      • 1970-01-01
      • 2017-02-18
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多