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直接返回函数被调用的地方。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值