Kotlin 尝试捕捉块不可到达?具有内部try finally块是否会导致无法访问外部try catch块?
我试图在Kotlin中编写一个简单的网站API调用,但在实现try-catch块时遇到了一些问题。直到最后一个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
// 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
总是抛出异常,并且编译器知道它