Kotlin 尝试捕捉块不可到达?具有内部try finally块是否会导致无法访问外部try catch块?

Kotlin 尝试捕捉块不可到达?具有内部try finally块是否会导致无法访问外部try catch块?,kotlin,Kotlin,我试图在Kotlin中编写一个简单的网站API调用,但在实现try-catch块时遇到了一些问题。直到最后一个catch语句将整个块转换为无法访问的代码为止,它一直平稳地运行 // REST web service call to get data from coinmarketcap API inner class RetrieveFeedTask : AsyncTask<Void, Void, String>() { override fun doInBackg

我试图在Kotlin中编写一个简单的网站API调用,但在实现try-catch块时遇到了一些问题。直到最后一个catch语句将整个块转换为无法访问的代码为止,它一直平稳地运行

     // REST web service call to get data from coinmarketcap API
inner class RetrieveFeedTask : AsyncTask<Void, Void, String>() {
    override fun doInBackground(vararg p0: Void?): String? {
 //            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        try {
            // create a connection
            val siteURL  = URL("https://api.coinmarketcap.com/v1/ticker/?limit=200")
            val urlConn = siteURL.openConnection() as HttpURLConnection
            urlConn.connect()
            // if there the connection is successful
            try {
                // reads the urlConn as a string
                val bufferedReader = urlConn.inputStream.bufferedReader()
                val stringBuilder = StringBuilder("")
                // each line from the json object
                var line : String?
                do {
                    line = bufferedReader.readLine()
                    stringBuilder.append(line).append("\n")
                    if (line === null)
                        break
                } while (true)
                bufferedReader.close()
                return stringBuilder.toString()
            } catch (e : Exception) {
                throw e
            } finally {
                urlConn.disconnect()
            }
        } catch (e : Exception) {
            Log.e("NETWORK","Couldn't connect to the website: " + e)
            return null
        }
    }

    override fun onPostExecute(result: String?) {
        if (result == null) {
            // should return an error message
            testTextView!!.text = "Error with website"
        } else {
            testTextView!!.text = result
        }
    }

}
//从coinmarketcap API获取数据的REST web服务调用
内部类RetrieveFeedTask:AsyncTask(){
覆盖有趣的背景(vararg p0:Void?):字符串{
//TODO(“未实现”)//要更改已创建函数的主体,请使用文件|设置|文件模板。
试一试{
//创建连接
val siteURL=URL(“https://api.coinmarketcap.com/v1/ticker/?limit=200")
val urlConn=siteURL.openConnection()作为HttpURLConnection
urlConn.connect()
//如果有,则连接成功
试一试{
//将urlConn作为字符串读取
val bufferedReader=urlConn.inputStream.bufferedReader()
val stringBuilder=stringBuilder(“”)
//json对象中的每一行
变量行:字符串?
做{
line=bufferedReader.readLine()
stringBuilder.append(行).append(“\n”)
如果(行===null)
打破
}while(true)
bufferedReader.close()
返回stringBuilder.toString()
}捕获(e:例外){
掷e
}最后{
urlConn.disconnect()
}
}捕获(e:例外){
Log.e(“网络”,“无法连接到网站:”+e)
返回空
}
}
重写onPostExecute(结果:字符串?){
如果(结果==null){
//应返回错误消息
testTextView!!.text=“网站错误”
}否则{
testTextView!!.text=结果
}
}
}

我认为,即使try块没有连接,最终的catch语句也会允许访问try块?我在四处阅读,看到finally语句将始终运行,因此我认为这可能是问题所在,但当我将其转换为catch块时,它仍然会给我相同的无法访问的代码。我想知道这是否只是科特林特有的,因为我刚刚开始学习它

内部
try
中缺少
catch
子句意味着任何异常都将被完全忽略。如果您想在外部
try
(同时仍然包含内部
最终
)中捕获异常,可以通过将其添加到内部
try
,重新抛出内部异常

catch (e: Exception) {
    throw e
}

“TODO”语句失效并使下面的代码无法访问,这是Kotlin的事情吗?似乎我必须注释掉try块上方的TODO注释以使其可访问。

TODO
将是最后执行的一行:

fun x() {
    TODO("Not implemented")
    //following is not reachable
    try {

    } catch (e: Exception) {

    }
}
这是因为
TODO
s的实现:

public inline fun TODO(reason: String): Nothing = 
    throw NotImplementedError("An operation is not implemented: $reason")

它抛出一个异常,因此返回
Nothing
,因此将始终是最后执行的操作(如果已达到)。

我无法重现此操作。我得到的唯一编译器错误或警告是缺少return语句,并且没有初始化
stringBuilder
。Kotlin中的TODO注释是否会导致下面的代码块无法访问?当我将其注释掉时,它解决了问题,我知道可以看到其他错误。您可以导航到的定义,看到它返回
Nothing
,并始终抛出。请不要在标题或问题中添加已解决的问题,而是接受已解决问题的答案question@msrd0我自己解决了所以我应该移除解决的吗?是的,因为
TODO
总是抛出异常,并且编译器知道它