2.5 kotlin中的异常

Kotlin中的异常处理语句的基本形式和Java类似。一个函数可以正常结束,也可以在出现错误的情况下抛出异常。方法的调用者能捕获到这个异常并处理它;如果没有被处理,异常会沿着调用栈再次抛出。抛出异常的方式也不例外:

val percentage = 111;

if (percentage in 0..100)

percentage

else

throw IllegalArgumentException("number error!$percentage")

和其他类一样,不必适用new关键字来创建异常实例。

和Java不同的是:Kotlin中throw结构是一个表达式

2.5.1 “try” "catch" 和"finally"

/**

* 不必显示地指定这个函数可能抛出的异常

* Kotlin并不区分受检异常和非受检异常

* reader.close()可能会抛出IOException,如果关闭失败,大多数程序都不会采取行动,所以捕获的代码就很冗余

*/

fun readNumber(reader: BufferedReader): Int? {

try {

val line = reader.readLine()

return Integer.parseInt(line)

} catch (e: NumberFormatException) {

return null

} finally {

reader.close()

}

}

 和Java最大的区别就是throws字句没有出现在代码中:如果用Java来写这个函数,你会显式地在函数的声明后面写上throws IOException。原因是IOException是一个受检异常。在Java中,这种异常必须显式地处理。

 Kotlin并不区分受检异常和非受检异常。不用指定函数抛出的异常,而且可以处理也可以不处理异常。这种设计是基于Java中使用异常的实践做出的决定,经验显示这些Java规则常常导致许多毫无意义的重新抛出或者省略异常的代码,而且这些规则不能总是保护你免受可能发生的错误。

例如,上例中,NumberFormatException就不是受检异常。因此,Java编译器并不会强迫你去捕获它,在运行时很容易看到这个异常发生。这很令人沮丧。于此同时,BufferReader.close 可能会抛出IOException。如果关闭失败,大多数程序都不会采取什么有意义的行动,所以捕获来自close方法的异常所需的代码就是冗余的代码。

2.5.2 "try" 作为表达式

fun readNumber(reader: BufferedReader) =

try {

val line = reader.readLine()

Integer.parseInt(line)

} catch (e: NumberFormatException) {

null

} finally {

reader.close()

}

Kotlin中的try关键字就像if和when一样,引入一个表达式,可以把它的值赋值给一个变量

参考《Kotlin实战》

猜你喜欢

转载自blog.csdn.net/cai784921129/article/details/81318024
2.5