Kotlin-异常处理

异常在学习与开发当中是最常见的,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的小伙伴有帮助。

你可能感兴趣的:(Kotlin-异常处理)