【问题标题】:Error in finally block "Variable reader must be initialised"finally 块中的错误“必须初始化变量读取器”
【发布时间】:2018-07-19 09:19:23
【问题描述】:

我是 kotlin 编程新手,在尝试关闭 BufferedReader 实例时遇到一个初始化错误。这是 kotlin 类:

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

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

【问题讨论】:

    标签: android kotlin


    【解决方案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()
    

    【讨论】:

    • 你能在我的代码中应用“使用”块吗?我不明白什么是 R?
    • 已经知道了,R 表示来源。这是一个信息量更大的答案。谢谢!
    • 但是请您再回答一件事,那在kotlin中finally块有什么用?
    • 同java。 use 在这里工作,因为 InputStreamclosable
    • 当然。是here
    【解决方案2】:

    val 变量只能赋值一次,BufferedReader 类型永远不能为空。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2013-01-03
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多