Kotlin 基础教程之异常
作者:行云间 时间:2022-10-31 06:34:52
Kotlin 基础教程之异常
概述
在Kotlin-null的处理里提到的NPE,它就是一个异常。而,异常是程序运行过程中出现的错误。在Kotlin中,所有的异常都继承于Throwable。对于每一个异常而言,它不仅仅包括异常的信息,还可以选择性包括异常的原因,而其原因也是一个异常的实例。
抛出异常
使用 throw表达式抛出异常:
throw MyException("Hi There!")
捕获异常
如果在函数内部抛出了异常(或者在函数内部调用的其他函数抛出了异常),这个函数将在抛出异常的地方结束。如果不希望函数结束,此时就必须捕获这个被抛出的异常并处理这个异常。
在Kotlin中,要捕获异常, 可以使用 try 表达式:
try {
// 某些代码
}
catch (e: SomeException) {
// 异常处理
}
finally {
// 可选的 finally 代码段
}
try语句块:表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。
catch语句块:会捕获try代码块中发生的异常并在其代码块中做异常处理,catch语句带一个Throwable类型的参数,表示可捕获异常类型。当try中出现异常时,catch会捕获到发生的异常,并和自己的异常类型匹配, 若匹配,则执行catch块中代码,并将catch块参数指向所抛的异常对象。catch语句可以有多个, 用来匹配多个中的一个异常,一旦匹上配后,就不再尝试匹配别的catch块了。 通过异常对象可以获取异常发生时完整的JVM堆栈信息,以及异常信息和异常发生的原因等。
finally语句块:紧跟catch语句后的语句块,这个语句块总是会在方法返回前执行,而不管是否try语句块是否发生异常。并且这个语句块总是在方法返回前执行。 目的是给程序一个补救的机会。这样做也体现了Java语言的健壮性。
注:
try、catch、finally三个语句块均不能单独使用,三者可以组成 try…catch…finally、try…catch、try…finally三种结构,catch语句可以有一个或多个,finally语句最多一个。
try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
多个catch块时候,只会匹配其中一个异常类并执行catch块代码,而不会再执行别的catch块,并且匹配catch语句的顺序是由上到下。
try表达式中可以有0个或多个catch代码段. finally 代码段可以省略. 但是,catch或 finally代码段至少要出现一个与try配对出现。
自定义异常
在Kotlin标准库中封装的异常类型,不可能会预见所有的可能碰见的异常情况,此时自己定义异常,来表示程序中可能出现的特定问题。
如果想自定义异常,就必须继承现有的异常类,一般都继承其异常情况相似的类,建立异常类型最简单的方法就是使用编辑器产生默认的构造方法,这样简单而有效。
fun main(args: Array<String>) {
var b: String? = null
try {
b?.length ?: throw MyExcepttion("b不能为空")
} catch (ex: MyExcepttion) {
println("ex: ${ex.message}")
} catch (npe: NullPointerException) {
println("npe: ${npe.message}")
} finally {
println("finally")
}
}
public class MyExcepttion(override val message: String) : Throwable(){
}
// Log
ex: b不能为空
finally
try表达式
在Kotlin中try是一个表达式, 也就是说, 它可以有返回值.
val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }
try表达式的返回值, 要么是try代码段内最后一个表达式的值,要么是 catch代码段内最后一个表达式的值. finally代码段的内容不会影响 try 表达式的结果值.
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://blog.csdn.net/io_field/article/details/53492541
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#监控文件夹变化的方法
![](https://img.aspxhome.com/file/2023/7/70417_0s.png)
Java四位电话号码的加密方法
![](https://img.aspxhome.com/file/2023/9/89629_0s.jpg)
Spring JPA联表查询之OneToOne源码详解
![](https://img.aspxhome.com/file/2023/3/67603_0s.jpg)
浅析C# 9.0 新特性之 Lambda 弃元参数
![](https://img.aspxhome.com/file/2023/9/119569_0s.png)
Kotlin基础教程之面向对象
![](https://img.aspxhome.com/file/2023/3/78973_0s.png)
Spring5中的WebClient使用方法详解
Android gradle打包并自动上传的方法
![](https://img.aspxhome.com/file/2023/9/138909_0s.jpg)
Android线程管理之ActivityThread
SpringMVC上传文件的两种方法
![](https://img.aspxhome.com/file/2023/2/59192_0s.jpg)
java 中遍历取值异常(Hashtable Enumerator)解决办法
C#数据表格(DataGridView)控件的应用案例
![](https://img.aspxhome.com/file/2023/0/78140_0s.gif)
spring boot动态切换数据源的实现
android仿支付宝密码输入框效果
![](https://img.aspxhome.com/file/2023/9/117069_0s.gif)
谈谈Java中整数类型(short int long)的存储方式
![](https://img.aspxhome.com/file/2023/9/67169_0s.png)
Android判断用户的网络类型实例讲解(2/3/4G、wifi)
![](https://img.aspxhome.com/file/2023/5/137285_0s.png)
C#遍历文件夹获取指定后缀名文件
![](https://img.aspxhome.com/file/2023/6/129696_0s.jpg)
java清除u盘内存卡里的垃圾文件示例
C#泛型的使用及示例详解
![](https://img.aspxhome.com/file/2023/0/89760_0s.png)
Android自定义一个view ViewRootImpl绘制流程示例
![](https://img.aspxhome.com/file/2023/8/123358_0s.png)