kotlin魔法runCatching

当我们需要把一个异常吐掉的时候,即不管异常,只管正常的情况,如果异常就返回null或者返回默认值,此时用runCatching就会使代码比较简洁,示例如下:

假设我们有一个网络请求方法叫getName(),它会通过网络获取一个名字回来,但是这个方法有可能抛出异常,比如网络异常中断,所以使用时需要try/catch,如下:

kotlin 复制代码
val name = try { getName() } catch (_: Exception) { null }
println("name = $name")

在这种情况下,发生异常时,我们没有对异常做任何处理,只是简单返回null,这种情况可以使用runCatching代替,代码将更优雅,如下:

kotlin 复制代码
val name = runCatching { getName() }.getOrNull()
println("name = $name")

如果失败,返回一个默认值也是可以的:

kotlin 复制代码
val name = runCatching { getName() }.getOrDefault("unknown")
println("name = $name")

这里面用到了一个Result类,感觉有点像Java 8出的Optional类,都是对一个值进行封装,然后就可以进行更多的个性化操作,所以我们可以自己去看Result类,它有很多的好用的方法。比如前面的示例,改成Result的基础使用方式为:

kotlin 复制代码
val nameResult: Result<String?> = runCatching { getName() }
nameResult.onSuccess { value: String? -> println("name = $value") }
nameResult.onFailure { e: Throwable -> e.printStackTrace() }
相关推荐
alexhilton11 小时前
2027 Android 开发者路线图:学习、面试与 AI
android·kotlin·android jetpack
灿飞屋13 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
唐青枫15 小时前
Kotlin 对象声明与对象表达式详解
kotlin
灿飞屋17 小时前
Kotlin与Java虚拟机四:函数
java·python·kotlin·安卓·android jetpack
金銀銅鐵1 天前
同一个 Hello World,Kotlin 和 Java 在字节码层面差在哪
jvm·后端·kotlin
Nerd(BUG版)3 天前
KMP学习day4--Kotlin空安全与泛型
学习·安全·kotlin
Nerd(BUG版)3 天前
KMP学习day5--Kotlin Flow异步流基础
开发语言·学习·kotlin
灿飞4 天前
Kotlin与Java虚拟机八:控制流与 when:卫语句、上下文相关解析与穷尽性
java·kotlin
灿飞5 天前
Kotlin与Java虚拟机七:空安全:把十亿美元的错误消灭在类型系统里
java·kotlin
俩个逗号。。6 天前
Kotlin flow 详解
android·开发语言·kotlin