异常处理
Kotlin中与Java中异常区别:
Kotlin抛弃了checked异常,相当于所有异常都是运行时异常,意味着程序员想捕获就捕获,不想捕获也可以,不需要使用throws关键字声明抛出异常;
异常处理机制语法
try{
}catch(e:Ex.ception){
}finally{}
包含1个try块,0~N个catch块(异常类型应该子异常在前父异常在后,否则子异常将永远得不到执行),0~1个finally块,但是catch与finally块必须至少出现其一;
工作原理:
try块中的代码出现异常,系统会自动生成一个异常对象,将该异常对象交给运行时环境,该过程叫做抛出异常;运行时环境获取异常对象,会找寻能处理该异常对象的catch块,找到就将该异常交给该catch块处理,该过程称为捕获异常,否则,运行时环境中止,程序退出;
需要注意的是:catch、try中如果执行到return语句,正常来说就该退出,但是如果此时还有finally块,会向转向执行完finall块,再回来执行该return语句;
try{
....
return
}catch(){
return
}finally{
......
}
还有一种情况如果catch、try、finally块中都有return,那么catch、try块的return语句将永远得不到执行;
try{
。。。
return
}catch(){
return
}finally{
return或者throw语句
}
如果在异常处理代码中使用System.exit(1)语句来退出虚拟机,finally块将不会被执行;
异常处理嵌套
即try块、catch、finally块中有可以嵌入完整的try…catch…finally,通常嵌套不应该超过两层;
try表达式
和if语句一样,try语句也可以作为表达式,表达式可以赋值给变量,表达式的值为try块中最后一个表达式的值或者catch块中最后一个表达式的值,finally块中的语句对表达式的值没有任何影响;
throw抛出异常
和Java类似,Kotlin允许抛出异常;
语法:
throw 异常实例
***由于kotlin没有checked异常(即使该异常在Java中是checked异常,在Kotlin中也不是checked异常)***,因此Kotlin抛异常无需放在try块中,程序既可显示使用try…catch捕获,也可完全不用理会该异常,将改一次交给该方法调用者处理;
自定义异常
自定义异常都应该继承Exception基类,定义异常是通常需要提供两个构造器:一个无参构造器,一个带字符串的构造器(该字符串将作为异常对象的描述信息,即异常对象的message属性返回值)
throw表达式
throw语句也可以作为表达式,但throw表达式的类型是Nothing类型,因此很少将throw语句赋值给其他变量。
关于Nothing类
这是Kotlin提供的一个特殊的类,专门用于表示永远不存在的对象;