Kotlin基础九'try', 'catch', 'finally'
Kotlin基础九’try’, ‘catch’, ‘finally’
‘try-catch-finally’
和Java一样,你可以使用try
-catch
-finally
去捕获和处理异常,接下来的例子中你可以看到它是如何工作的:
fun readNumber(reader: BufferedReader): Int? {//你不需要像Java那样声明这个函数会抛出什么异常
try {
val line = reader.readLine()
return Integer.parseInt(line)
} catch (e: NumberFormatException) {
return null
}
finally {//和Java的finally一样
reader.close()
}
}
fun main(args: Array<String>) {
val reader = BufferedReader(StringReader("1234"))
println(readNumber(reader))
}
//result
1234
Process finished with exit code 0
这段代码和Java最大的不同就是在Java中,你必须在函数后声明你的函数会抛出什么已检查的类型异常,比如这里你得在你的函数声明后面声明你的函数会抛出IOException
。在Kotlin中,这是不必要的。
Kotlin和其他现代的JVM语言一样,并不区分已检查异常
和未检查异常
,你不需要指出你的函数或者方法可以抛出什么异常。
这样的设计是基于Java的大量用例,经验表明,Java的规则通常需要很多无意义的代码来重新抛出或者忽略异常,这种规则并不能始终保护你可以免受发生错误的影响。
比如说,像上面写的代码,NumberFormatException
不是一个已检查异常
,因此,Java编译器不强制要求你捕获它,但是你可以很轻易地看到它会在运行时发生错误,一些不合法的数据输入所导致它的发生。与此同时,BufferedReader.cose()
方法可以抛出一个IOException
,它是个已检查异常
,需要被捕获处理。但是很多的程序在流
关闭失败时也并不能做出什么有效的处理。
‘try’作为一个表达式
让我们来看看和Java相比另一个比较有意思的不同:
fun readNumber(reader: BufferedReader) {
val number = try {
Integer.parseInt(reader.readLine())
} catch (e: NumberFormatException) {
return
}
println(number)
}
fun main(args: Array<String>) {
readNumber(BufferedReader(StringReader("1234")))
readNumber(BufferedReader(StringReader("not a num")))
}
//result:
1234
Process finished with exit code 0
可以看到,只有一行输出,第二个函数调用并没有执行到打印语句。在这里try
作为了一个带有值的表达式,如果字符串解析成功,返回解析后的数字,否则进入catch
直接返回函数被调用的地方。