Java 制作简单代码,但应用程序在kotlin中停止工作

Java 制作简单代码,但应用程序在kotlin中停止工作,java,android,kotlin,Java,Android,Kotlin,我正在尝试学习kotlin语言,我的第一个应用是从json数组获取数据。但问题是,当开始调试应用程序时,l出现了致命的异常:main和应用程序已停止工作。在我的Android应用程序中,我设计了以下json数据结构 我的代码是: package com.example.ali.test import android.os.AsyncTask import android.support.v7.app.AppCompatActivity import android.os.Bundle impo

我正在尝试学习kotlin语言,我的第一个应用是从json数组获取数据。但问题是,当开始调试应用程序时,l出现了致命的异常:main和应用程序已停止工作。在我的Android应用程序中,我设计了以下json数据结构

我的代码是:

package com.example.ali.test

import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*
import org.json.JSONArray
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStream
import java.io.InputStreamReader
import java.net.HttpURLConnection
import java.net.URL

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val url = "https://mysafeinfo.com/api/data?list=presidents&format=json"
        Download().execute(url)

    }
//    full class for json api
    inner class Download : AsyncTask<String,String,String>(){

        override fun onPreExecute() {
        }
//        for build connection
        override fun doInBackground(vararg p0: String?): String{

            try {

                val url = URL(p0[0])
                val urlConnect = url.openConnection() as HttpURLConnection
                urlConnect.connectTimeout = 700
                val inputStream = urlConnect.inputStream
                val dataJsonAsStr = covertStreamToString(urlConnect.inputStream)
                publishProgress(dataJsonAsStr)

                }   catch (e: Exception){

            }
            return ""
        }

//        for get items from json api
        override fun onProgressUpdate(vararg values: String?) {



        }

        override fun onPostExecute(result: String?) {

            super.onPostExecute(result)
            handleJson(result)

        }


    }

    fun handleJson (jsonString: String?){

        val jsonArray = JSONArray(jsonString)
        val list =  ArrayList<FlightShdu>()
        var x = 0
        while (x < jsonArray.length()){

            val jsonObject = jsonArray.getJSONObject(x)
            list.add(FlightShdu(

                jsonObject.getInt("id"),
                jsonObject.getString("nm")
            ))


            x++
        }
        val adapter = ListAdapte(this@MainActivity,list)
        flightShdu_list.adapter = adapter

    }

//    for connection api
    fun covertStreamToString (inputStream: InputStream): String {

        val bufferReader = BufferedReader(InputStreamReader(inputStream))
        var line:String
        var  allString:String=""
        try {
            do{
                line=bufferReader.readLine()
                if (line!=null)
                    allString+=line
            }while (line!=null)

            bufferReader.close()
        }catch (ex:java.lang.Exception){}

        return allString;
    }
}
package com.example.ali.test
导入android.os.AsyncTask
导入android.support.v7.app.AppActivity
导入android.os.Bundle
导入kotlinx.android.synthetic.main.activity\u main*
导入kotlinx.android.synthetic.main.activity\u main.view*
导入org.json.JSONArray
导入org.json.JSONObject
导入java.io.BufferedReader
导入java.io.InputStream
导入java.io.InputStreamReader
导入java.net.HttpURLConnection
导入java.net.URL
类MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val url=”https://mysafeinfo.com/api/data?list=presidents&format=json"
下载().execute(url)
}
//json api的完整类
内部类下载:AsyncTask(){
覆盖乐趣onPreExecute(){
}
//用于构建连接
重写fun doInBackground(vararg p0:String?:String){
试一试{
val url=url(p0[0])
val urlConnect=url.openConnection()作为HttpURLConnection
urlConnect.connectTimeout=700
val inputStream=urlConnect.inputStream
val dataJsonAsStr=covertStreamToString(urlConnect.inputStream)
出版进度(dataJsonAsStr)
}捕获(e:例外){
}
返回“”
}
//用于从json api获取项目
重写进程更新(vararg值:字符串?){
}
重写onPostExecute(结果:字符串?){
super.onPostExecute(结果)
handleJson(结果)
}
}
有趣的handleJson(jsonString:String?){
val jsonArray=jsonArray(jsonString)
val list=ArrayList()
变量x=0
而(x
控制台中的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.ali.test, PID: 24738
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386) 
     Caused by: org.json.JSONException: End of input at character 0 of 
        at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
        at org.json.JSONTokener.nextValue(JSONTokener.java:97)
        at org.json.JSONArray.<init>(JSONArray.java:92)
        at org.json.JSONArray.<init>(JSONArray.java:108)
        at com.example.ali.test.MainActivity.handleJson(MainActivity.kt:68)
        at com.example.ali.test.MainActivity$Download.onPostExecute(MainActivity.kt:59)
        at com.example.ali.test.MainActivity$Download.onPostExecute(MainActivity.kt:27)
        at android.os.AsyncTask.finish(AsyncTask.java:660)
        at android.os.AsyncTask.-wrap1(AsyncTask.java)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6776)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386) 
E/AndroidRuntime:致命异常:主
进程:com.example.ali.test,PID:24738
java.lang.RuntimeException:java.lang.reflect.InvocationTargetException
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
原因:java.lang.reflect.InvocationTargetException
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1496)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
由以下原因引起:org.json.JSONException:的字符0处输入结束
位于org.json.JSONTokener.syntaxError(JSONTokener.java:449)
位于org.json.JSONTokener.nextValue(JSONTokener.java:97)
位于org.json.JSONArray(JSONArray.java:92)
位于org.json.JSONArray(JSONArray.java:108)
位于com.example.ali.test.MainActivity.handleJson(MainActivity.kt:68)
在com.example.ali.test.MainActivity$Download.onPostExecute上(MainActivity.kt:59)
在com.example.ali.test.MainActivity$Download.onPostExecute上(MainActivity.kt:27)
位于android.os.AsyncTask.finish(AsyncTask.java:660)
位于android.os.AsyncTask.-wrap1(AsyncTask.java)
在android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)中
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6776)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1496)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
有人知道吗

您的
doInBackground()
总是返回一个空字符串,
”。此空字符串将作为参数传递给
onPostExecute
,后者反过来将此空字符串用作
handleJson
的参数。当您尝试从这个空字符串创建JSON数组时,它在索引0处抛出一个异常,因为它没有更多的数据,并且不是有效的JSON

您需要从
doInBackground()
返回网络调用的结果,而不是空字符串。

**

使用如下示例所示的代码:

**

class MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val s=tvDisplay.text.toString()
btnOk.setOnClickListener{
下载()。执行
}
}
内部类下载:AsyncTask(){
覆盖乐趣doInBackground(vararg ss:String?):Void{
验证(ss[0]!!)
返回空
}
}
私人娱乐验证(s:字符串){
如果(s.isNotEmpty()){
runOnUiThread{
Toast.makeText(这是“Working:)”,Toast.LENGTH\u SHORT.show()
}
}
其他的
class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val s = tvDisplay.text.toString()

    btnOk.setOnClickListener {
        Download().execute(s)

    }
}

inner class Download : AsyncTask<String, Void, Void>() {
    override fun doInBackground(vararg ss: String?): Void? {
        validate(ss[0]!!)
        return null
    }


}

private fun validate(s:String) {

    if(s.isNotEmpty()){

        runOnUiThread {
            Toast.makeText(this, "Working :)", Toast.LENGTH_SHORT).show()
        }

    }
    else{
        runOnUiThread {
            Toast.makeText(this, "Not Working :(", Toast.LENGTH_SHORT).show()
        }
    }
}