大家过年好。我现在学习了Kotlin的异常处理,现在又开始更新了。希望大家新的一年万事顺利,肺炎疫情能早日得到控制。
使用的软件是 IDEA 2019。
已经熟悉Java中的异常的可以简单略过,Kotlin中所用的异常依然是Java文件定义的。
1、所有异常的超类→Throwable
Kotlin中,关于Throwable的知识和Java中是类似的。
Kotlin中的异常都间接继承了一个超类Throwable,Throwable被两种类直接继承:Error(错误)和Exception(异常)。
错误和异常相比,往往更加严重。**如果能捕获异常,确定处理逻辑,在发生异常时,程序就不至于崩溃停止,**依然是可以运行的。但是发生了错误则程序是肯定不能正常运行的。这里主要讲解异常。
异常处理算是软件最基本的功能之一,比较复杂的软件可能会发生各种异常,因为异常而经常崩溃是绝对不能允许的。
2、异常→Exception
我们从常见的异常说起。
数组索引越界 (ArrayIndexOutOfBoundsException) 是一种常见的异常,在IDEA下按住ctrl键点击可以查看 ArrayIndexOutOfBoundsException 的详细信息。可以看到ArrayIndexOutOfBoundsException 的继承关系为(从最底到最顶):
ArrayIndexOutOfBoundsException数组越界异常 → IndexOutOfBoundsException越界异常→RuntimeException运行异常→Exception异常→Throwable可抛
同时也注意到,Kotlin所用的依然是Java中的异常类型,相关异常的定义都在Java文件中。
下面来学一下异常处理的语句结构。
3、try…catch…finally
try…catch…finally语句的结构是:
try {
//可能会出现异常的代码
} catch (e:Exception) {
//如果在try模块中发生了异常e,则跳至catch中执行其中的语句
} finally {
//不论try...catch...执行结果如何,最后都会执行finally模块中的语句
}
下面可以来编写一段比较简单的程序,用来检测数组越界问题。
代码如下:
class ExceptionTest(var IntArray:Array<Int>) {
var i:Int=6
init {
}
fun printMessage() {
while(i>=0) {
try {
println("${IntArray[i]}\t下标\t$i")
} catch (e:ArrayIndexOutOfBoundsException) {
println("出现异常,\t数组中不存在下标为$i 的元素")
} finally {
i--
}
}
}
}
fun main() {
var ee:ExceptionTest = ExceptionTest(arrayOf(1,2,3,4,5,6))
ee.printMessage()
}
输出结果如下:
出现异常, 数组中不存在下标为6 的元素
6 下标 5
5 下标 4
4 下标 3
3 下标 2
2 下标 1
1 下标 0
在printMessage函数中,我们在try…catch…finally语句中,尝试打印数组中下标为i的元素。为了排除可能存在的数组越界问题,我们把数组元素打印的行为放在try语句块中,在catch语句块中,先通过指定异常e的类型捕获了数组越界异常,对于这种情况,我们输出了一段提示信息。
在finally语句块中,我们令i减小1,这是不论之前两步结果如何,这一步都会执行的。当然,如果程序的异常导致程序无法运行则另当别论。
这样,本来数组会因为越界而导致程序报错,我们添加了异常处理逻辑之后,成功捕获了越界异常,指定了处理逻辑,程序依然可以正常的运行,输出数组中的元素,并在越界时,给出提示信息。
需要注意的是,catch中指定了异常的类型,这一段catch语句就只能捕获这一种异常,可以有多个catch模块,因为一段程序中可能会出现不止一种异常,但是这就要求我们要考虑到所有可能的情况,这是需要锻炼的。
Kotlin(Java)本身就提供了许多异常,但是有些时候,我们仍然需要自定义异常类型来处理我们自己的异常,之后会更新自定义异常的知识。