面试题答案
一键面试-
异常处理机制不同点
- GlobalScope.launch:它启动的是一个顶层协程,运行在一个与应用程序生命周期绑定的作用域中。如果这个协程抛出未捕获的异常,默认情况下,它不会直接导致应用崩溃,但是会打印异常日志到控制台。这种方式适用于那些即使失败也不应该影响应用整体运行的后台任务。
- runBlocking:它会阻塞当前线程直到其内部协程执行完毕。如果内部协程抛出异常,这个异常会直接抛给调用
runBlocking
的代码块,就像普通函数抛出异常一样,可能导致调用栈上的代码处理异常或者使应用崩溃(如果没有合适的异常处理)。
-
捕获异常示例
- GlobalScope.launch:
import kotlinx.coroutines.*
fun main() {
GlobalScope.launch {
try {
throw RuntimeException("模拟异常")
} catch (e: Exception) {
println("捕获到异常: $e")
}
}
Thread.sleep(1000)
}
在上述代码中,通过try - catch
块捕获GlobalScope.launch
协程内部抛出的异常。
- runBlocking:
import kotlinx.coroutines.*
fun main() {
try {
runBlocking {
throw RuntimeException("模拟异常")
}
} catch (e: Exception) {
println("捕获到异常: $e")
}
}
这里通过在调用runBlocking
的外层使用try - catch
块来捕获其内部协程抛出的异常。