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