kotlin 异常处理机制类似 Java 异常处理机制。但有一点不同,Java 中的异常分为两类,受检查异常 和 运行时异常,受检查异常要用try-catch 捕获,要么抛出,否则会发生编译错误。而 kotlin 中没有受检查异常,所有异常都是运行时异常,即便是原本在 Java 中的受检查异常,在 kotlin 中也是运行时异常,例如:IOException 在 Java 中是受检查异常,在 kotlin 中是运行时异常。
Kotlin异常介绍:
Kotlin中的异常有3种,Exception、Error和Throwable,所有异常都直接或间接的继承于Throwable类,它们的继承关系如下:
在Throwable类中有几个非常重要的属性和函数:
message 属性:
保存发生错误或异常时的详细信息。
printStackTrace 函数:
打印错误或异常堆栈跟踪信息。
toString 函数:
获取错误或异常对象的描述。
Throwable有两个子类:Error和Exception。
Error:
是程序无法恢复的严重错误,程序员根本无能为力,只能让程序中止。例如:Java虚拟机内部错误、内存溢出等情况。
Exception:
是程序可以恢复的异常,它是程序员所能掌控的。例如:空指针访问、网络连接中断和读取不存在文件等。
Kotlin异常处理:
在Kotlin中,因为所有异常都是非必检的,所以异常不必成为函数的组成部分。处理一个异常与Java类似,用try、catch、finally块。其中将可能发生异常的语句放在try{}中,catch程序块来处理不同种类的异常,finally可选且最后执行。语法如下:
try {
//程序代码块
}catch (e:ExceptionType1){
//对ExceptionType1的处理
}catch (e:ExceptionType2){
//对ExceptionType2的处理
} finally {
//最后执行程序
}
下面看个例子:
companion object {
@JvmStatic
fun main(args: Array<String>) {
try {
val name: String? = null
println(name!!.length)
} catch (e: Exception) {
e.printStackTrace()
}finally {
println("结束")
}
}
}
//结果:
kotlin.KotlinNullPointerException
at com.alfred.Test$Companion.main(Test.kt:14)
at com.alfred.Test.main(Test.kt)
结束
Kotlin throw关键字:
用于抛出显式异常。它用于抛出自定义异常。要抛出异常对象,将使用throw-expression。
throw关键字的语法
throw SomeException()
让我们来看一下throw关键字的示例:
fun main(args: Array<String>) {
var age: Int = (0..50).random()
validate(age)
}
fun validate(age: Int) {
println("age = $age")
if (age < 18)
throw ArithmeticException("小学生不能玩吃鸡")
else
println("不错,你满18岁了,可以玩吃鸡")
}
//执行第一次结果:
age = 12
Exception in thread "main" java.lang.ArithmeticException: 小学生不能玩吃鸡
at com.alfred.TestKt.validate(Test.kt:16)
at com.alfred.TestKt.main(Test.kt:10)
//执行第二次结果:
age = 39
不错,你满18岁了,可以玩吃鸡