Kotlin try…catch和finally

Kotlin try…catch和finally,由于什么是异常中的代码在运行过程中发生了异常,程序立即终止,不能继续向下执行。为了解决这样的问题,Kotlin中提供了一种对异常进行处理的方式——异常捕获。异常捕获通常使用try…catch语句来实现,异常捕获的语法格式如下:

try { 
    //  程序代码 
}catch (e: SomeException) { // e: 后面的这个类可以是Exception 类或者其子类 
    //  对捕获的Exception 进行处理 
}

上述语法格式中,try代码块中编写的是可能发生异常的Kotlin语句,catch代码块中编写的是对捕获的异常进行处理的代码。当try代码块中的程序发生了异常,系统会将这个异常的信息封装成一个异常对象,并将这个对象传递给catch代码块。catch代码块中传递的Exception类型的参数是指定这个程序能够接收的异常类型,这个参数的类型必须是Exception类或者其子类。

接下来我们使用try…catch语句对什么是异常中出现的异常进行捕获,具体代码如下所示。

package com.itheima.chapter04
fun divide(a: Int, b: Int): Int {
    var result: Int = a / b
    return result
}
fun main(args: Array<String>) {
    try {
        var result: Int = divide(5, 0)
        println(result)
   } catch (e: Exception) {
       println(" 捕获的异常信息为:" + e.message)
   }
   println(" 程序继续执行")
}

运行结果:

捕获的异常信息为:/by zero
程序继续执行

在上述代码中,对可能发生异常的代码用try…catch语句进行了处理,在try代码块中发生被0除异常之后,程序会接着执行catch中的代码,通过调用Exception对象中的message来返回异常信息“by/zero”,catch代码块对异常处理完毕之后,程序会继续向下执行,而不会出现异常终止。

需要注意的是,在try代码块中,发生异常的语句后面的代码是不会被执行的,如本案例中的第9行代码的输出语句就没有执行。

在程序中,由于功能的需求,有些语句在无论程序是否发生异常的情况下都要执行,这时就可以在try…catch语句后添加一个finally代码块。接下来我们来对上面代码进行修改,看一下finally代码块的用法,具体代码如下所示。

package com.itheima.chapter04
fun divide(a: Int, b: Int): Int {
    var result: Int = a / b
    return result
}
fun main(args: Array<String>) {
    try {
        var result: Int = divide(5, 0)  // 调用divide() 方法
        println(result)
   } catch (e: Exception) {
       println(" 捕获的异常信息为:" + e.message)
    return                              // 用于结束当前语句
   } finally {
       println(" 进入finally代码块")
   }
   println(" 程序继续执行")
}

运行结果:

捕获的异常信息为:/by zero
进入finally代码块

在上述代码中,catch代码块中增加了一个return语句,用于结束当前方法,此时第16行的代码就不会执行了,而finally中的代码仍会执行,并不会被return语句所影响。不论程序发生异常还是用return语句结束当前方法,finally中的语句都会执行,由于finally语句的这种特殊性,因此在程序设计时,经常会在try…catch后使用finally代码块来完成必须做的事情,如释放系统资源。

需要注意的是,当catch代码块中执行了System.exit(0)语句时,finally中的代码块就不会执行。System.exit(0)表示退出当前的程序,退出当前程序后,任何代码都不能再执行了。

与Java中的try…catch…finally对比

与Java不同的是,在try…catch…finally中,try是一个表达式,即它可以返回一个值,try表达式的返回值是try代码块中的最后一个表达式的结果或者是所有catch代码块中的最后一个表达式的结果,finally代码块中的内容不会影响表达式的结果。接下来我们通过一个案例来演示try…catch…finally代码块中的结果,具体代码如下所示。

package com.itheima.chapter04
fun main(args: Array<String>) {
    var age: Int? = try {
        10      // 正常运行,返回10
    } catch (e: NumberFormatException) {
        12
        null
    } finally {
        13      //finally 代码块不会影响表达式结果
   }
   var score: Int? = try {
       Integer.parseInt("s" + 1)
   } catch (e: NumberFormatException) {
       60
       null   //捕获异常,返回null
   } finally {
       70     //finally 代码块不会影响表达式结果
   }
   println(" 年龄age=${age}")
   println(" 分数score=${score}")
}

运行结果:

年龄age=10
分数score=null

上述代码中,分别定义了2个变量age与score,age表示年龄,score表示分数,这2个变量的值都是用try…catch…finally代码块包括起来的,根据程序的运行结果可知,当给变量age赋值时,程序正常运行,则age的值是10,即try表达式的结果。当给变量score赋值时,程序出现了异常,此时score的值是null,即catch代码块中最后一个表达式的结果。其中finally代码块中的内容不影响try和catch代码块中表达式的结果。

总结
try…catch…finally语句中,catch代码块可以有多个也可以没有,finally代码块可以省略,但是catch和finally代码块至少应有一个是存在的。

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!