一、kotlin如何抛异样
Kotlin中的异样解决与Java或者其余语言中的解决形式类似。一个函数能够以失常形式完结,或者当谬误产生的时候抛出异样。函数调用者捕捉这个异样并解决它;如果没有,异样从新在调用栈向上抛。
Kotlin中的异样解决语句的根本模式和Java是类似的: java中:
if(0 <= percentage <= 100){
throw new IllegalArgumentException( "A percentage value must be between 0 and 100: $percentage") ;
}
kotlin中:(和java的区别,不用应用new来创立实例)
if (percentage !in 0..100) {
throw IllegalArgumentException( "A percentage value must be between 0 and 100: $percentage")
}
不光如此,kotlin中的throw构造是一个表达式,能作为另一个表达式的一部分应用:
val percentage =
if (number in 0..100)
number
else
throw IllegalArgumentException( //“throw” 是一个表达式
"A percentage value must be between 0 and 100: $number")
这个例子中,如果满足条件,程序的行为正确,percentage会number初始化,否则异样将被抛出,而变量也不会初始化。
二、“try”、“catch”、“finally”
就像Java之中,能够用try构造,和catch和finally子句解决异样。
如下,读取指定文件的一行,尝试解析为数字,而后返回一个数字,如果这行不是无效的数字,返回null。
fun readNumber(reader: BufferedReader): Int? { //不用显式地指定这个函数可能抛出的异样
try {
val line = reader.readLine()
return Integer.parseInt(line)
} catch (e: NumberFormatException) { //异样的类型在左边
return null
} finally { //finally就像在Java一样的
reader.close()
}
}
val reader = BufferedReader(StringReader("239"))
println(readNumber(reader))
//239
java中:
public int readNumber(BufferedReader reader) throws IOException{ //显式地指定这个函数可能抛出的异样
try {
String line = reader.readLine()
return Integer.parseInt(line)
} catch (NumberFormatException e) {
return null
} finally {
reader.close()
}
}
从比照中咱们能够看出kotlin和Java最大的不同是不须要throws子句。在java中,这种异样必须显示的解决,必须申明你的函数可能抛出的所有受检异样。 如果调用另一个函数,须要解决这个函数的受检异样,或者申明你的函数可能抛出的这些异样。
和其余古代JVM语言,Koltin不区别受检查和不受查看的异样。你须要指定一个函数抛出的异样,你能够也能够不解决这些异样。这个设计决定是基于Java中应用受查看异样的实际。教训表明,Java规定经常须要很多无意义的代码从新抛出或者疏忽异样,而且这些规定不能总是爱护你免受坑你产生的谬误。
在下面的例子中,NumberFormatException是一个不受查看的异样。所以Java编译器不会强制你捕捉这个异样,你能够很容易的看见运行时的异样。这相当令人遗憾,因为不无效的输出数据是常常的事件,应该更优雅的解决。同时,BufferedReader.close办法也能抛出一个IOException异样,这是个须要解决的受查看的异样。如果敞开一个流失败了,大部分代码不能采取任何有意义的口头,所以须要从close办法捕捉异样的代码根本是样板代码。
三、try作为一个表达式
为了显示Java和Kotlin间接一个重要区别,让咱们略微扭转下这个例子。移除fianlly局部(因为你曾经晓得这个怎么工作),而后加一些代码打印从这个文件读取的数字。
fun readNumber(reader: BufferedReader) {
val number = try {
Integer.parseInt(reader.readLine()) //成为try表达式的值
} catch (e: NumberFormatException) {
return
}
println(number)
}
val reader = BufferedReader(StringReader("not a number"))
readNumber(reader)//没有打印任何数字
Kotlin中try关键词,就像if和when,引进了一个表达式,你能够把它的值赋值给一个变量。不像if,你始终须要把语句保函在花括号中。就像其余语句,如果包涵多个表达式,try表达式的值是最初一个表达式的值。在这个例子中,在catch代码块中有return语句,所以这个函数在catch代码块后不会再进行。如果你想持续这个执行,catch语句也须要一个值,这个值是最初表达式的值:
fun readNumber(reader: BufferedReader) {
val number = try {
Integer.parseInt(reader.readLine()) //没有异样产生时应用这个值
} catch (e: NumberFormatException) {
null //异样产生时应用null值
}
println(number)
}
val reader = BufferedReader(StringReader("not a number"))
readNumber(reader)//异样被抛出,所以函数打印null
//null
如果一个try代码块执行一切正常,代码块中最初一个表达式就是后果。如果捕捉到一个异样,那么cache代码块中最初一个表达式就是后果。
四、总结
- 1、kotlin中的异样解决和java解决类似,除了Kotlin不要求你申明函数能够抛出的异样。
- 2、如果一个try代码块执行一切正常,代码块中最初一个表达式就是后果。
- 3、如果捕捉到一个异样,那么cache代码块中最初一个表达式就是后果。
本文转自 https://cloud.tencent.com/developer/article/1397852,如有侵权,请分割删除。
相干视频:
Android进阶学习:Kotlin核心技术_哔哩哔哩_bilibili
Android网络架构搭建与原理解析(一)——通过一个网络申请一步一步见证网络模块的成长_哔哩哔哩_bilibili
【Android进阶课程】——colin Compose的绘制原理解说(一)_哔哩哔哩_bilibili
【 Android进阶教程】——Framework面试必问的Handler源码解析_哔哩哔哩_bilibili
【 Android进阶教程】——热修复原理解析_哔哩哔哩_bilibili
【 Android进阶教程】——如何解决OOM问题与LeakCanary原理解析_哔哩哔哩_bilibili
发表回复