异常在学习与开发当中是最常见的,Kotlin的异常处理和Java以及其他开发语言的处理方式很相似。一个函数可以正常结束,也可以在出现错误的情况下抛出异常。方法的调用者能捕获这个异常并处理它:如果没有处理,异常会沿调用栈抛出。
举例一个完整的Kotlin的抛出异常的代码:
fun main() {
val number = 300
val percentage = if (number in 0..100)
number
else
throw IllegalArgumentException("$number:不在0-100之间")
println("查看比对结果:" + percentage)
}
在执行的代码的时候,因为300不属于0-100之间,所以控制台打印了异常。
try-catch-finally
和Java一样,使用带有catch和finally子句的try结构来处理异常。举例从给定的文件中读取一行,尝试把它解析成一个数字,返回这个数字;或者当这一行不是一个有效的数字时返回null。
import java.io.BufferedReader
import java.io.StringReader
import java.lang.NumberFormatException
/**像在Java中一样使用try*/
fun readNumber(reader: BufferedReader): Int? {
return try {
val line = reader.readLine()
Integer.parseInt(line)
} catch (e: NumberFormatException) {
null
} finally {
reader.close()
}
}
fun main() {
val reader = BufferedReader(StringReader("259"))
println(readNumber(reader))
}
和Java最大的区别就是throws
子句没有出现在代码中:如果在Java来写这个函数,你会显式地在函数声明写上throws IOException
,需要这样做的是因为IOException
是一个受检异常。在Java当中,这种异常必须显式处理,必须声明你的函数也能抛出异常。
把try当作表达式
引用《Kotlin实战》中的例子
import java.io.BufferedReader
import java.io.StringReader
import java.lang.NumberFormatException
/**把try当作表达式*/
fun readNumberTry(reader: BufferedReader) {
val number = try {
Integer.parseInt(reader.readLine())
} catch (e: NumberFormatException) {
return
}
println(number)
}
fun main() {
val reader = BufferedReader(StringReader("这不是一个数字"))
readNumberTry(reader)
}
这个例子将return
语句放在catch
代码块中,因 该函数的执行在 catch
代码块之后不会继续运行。如果你想继续执行, catch
子句也需要有 个值 它将是子句中最后一个表达式的值。
学习收获
简单实现了Kotlin中的异常处理方法,然后Kotlin没有区分受检异常
和未受检异常
。不用指定函数抛出的异常,而且可以处理也可以不处理,可以减少一些代码疏忽造成了异常导致程序崩溃。
希望我这篇文章对学习Kotlin的小伙伴有帮助。