最终块“必须初始化变量读取器”中的错误

时间:2018-07-19 09:19:24

标签: android kotlin

我是Kotlin编程的新手,尝试关闭BufferedReader实例时遇到一个初始化错误。这是科特琳课:

package first.kot.kotprac

import android.os.AsyncTask
import android.util.Log
import java.io.BufferedReader
import java.io.File
import java.io.InputStreamReader
import java.net.ResponseCache
import java.net.URL
import javax.net.ssl.HttpsURLConnection

class MyAsyncTask : AsyncTask<Void, Void, Void>() {

    private val TAG = "MyAsyncTask"
    private var responseData = ""

    override fun doInBackground(vararg params: Void?): Void? {

        val reader : BufferedReader

        try{

            val url= URL("vvv")

            val conn = url.openConnection() as HttpsURLConnection

            val responseCode = conn.responseCode

            Log.e(TAG,"Response code: "+responseCode);

            if(responseCode == HttpsURLConnection.HTTP_OK){
                reader = BufferedReader(InputStreamReader(conn.inputStream))

                var sb = StringBuilder()

                reader.lineSequence().forEach {
                    sb.append(it+"\n")
                }

            responseData = sb.toString()

            }


        }catch (e: Exception){
            e.printStackTrace()
        }
        finally {
            if(reader!=null)
            reader.close()       // Error line
        }

        return null
    }
}

我经历了以下线程:

https://stackoverflow.com/questions/41537638/assignment-not-allowed-in-while-expression

但是我不知道打勾的答案中的第二种方法如何确保关闭缓冲区,而我主要关心的是也要解决当前问题。请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

val变量只能分配一次,并且BufferedReader类型永远不能为空。

您需要将其替换为var reader : BufferedReader? = null,这是一种可为null的类型,已初始化为null。

答案 1 :(得分:1)

您应该使用use。来自文档

  

对此资源执行给定的块函数,然后将其关闭   正确地确定是否抛出异常。

这样,您可以避免finally块。了解更多here

以字符串形式读取InputStream的扩展名:

fun InputStream.readTextAndClose(charset: Charset = Charsets.UTF_8): String {
    return this.bufferedReader(charset).use { it.readText() }
}

根据您的情况,您可以将代码替换为

responseData = conn.inputStream.readTextAndClose()