一、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