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代码块至少应有一个是存在的。
酷客教程相关文章:
评论前必须登录!
注册