2.5Kotlin中的异常

Kotlin的异常处理和Java以及其他许多语言的处理方式相似,异常处理语句的基本形式和Java类似,抛出异常的方式也不例外:

if (percentage !in 0..100) {
    throw IllegalArgumentException ("百分数$percentage必须在0到100之间")
}

和所有其他的类一样,不必使用new关键字来创建异常实例。
和Java不同的是,Kotlin中throw结构是一个表达式,能作为另一个表达式的一部分使用:

val percentage = if (number in 0..100)
                      number
                  else
                      throw IllegalArgumentException ("百分数$percentage必须在0到100之间")     

在这个例子中,如果条件满足,程序的行为是正确的,而percentage变量会用number初始化,否则会抛出异常,而变量也不会初始化。

2.5.1try、catch和finally

和Java一样,使用带有catch和finally子句的try结构来处理异常。下面代码会看到这个结构,这个例子从给定的文件中读取一行,尝试把它解析成数字,返回这个数字;或者当这一行不是一个有效数字时返回null。

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是一个受检异常。
和其他许多现代JVM语言一样,Kotlin并不区分受检异常和未受检异常。不用指定函数抛出的异常,而且可以处理也可以不处理异常。经验显示Java规则常常导致许多毫无意义的重新抛出或者忽略异常的代码,而且这些规则并不能总是避免可能发生的错误。

2.5.2try作为表达式

为了了解Kotlin和Java之间另外一个显著的差距,修改一下这个例子。去掉finally部分,(因为已经看过它是怎样工作的),并添加一些代码,用来打印从文件中读取的数字:

fun readNumber(reader: BufferedReader) {
        val number = try {
            Integer.parseInt(reader.readLine())
        } catch (e: NumberFormatException) {
            return
        }
    }

调用会发现没有任何输出。
Kotlin中的try关键字就像if和when一样,引入了表达式,可以把它的值赋给一个变量。不同于if,总是需要用花括号把语句主体括起来。和其他语句一样,如果其主体包含多个表达式,那么整个try表达式的值就是最后一个表达式的值。

猜你喜欢

转载自blog.csdn.net/qq_26413249/article/details/80316526
2.5