从Java转Kotlin:获取可空嵌套对象ID并抛异常的方法优化咨询
Kotlin 中更简洁的写法优化
针对你这段解析ID的代码,Kotlin提供了更贴合语言特性的简洁写法,主要可以利用Elvis操作符或者标准库空值检查函数来简化:
方法一:使用 Elvis 操作符(最常用)
直接把空值判断和抛出异常合并到一行,逻辑清晰且代码更紧凑:
fun parseId(obj: WrappingObject): Long { return obj.nullableNestedObject?.myId ?: run { logger.error("Id not found because of ...") throw InternalException("Id not found") } }
如果日志和异常逻辑简单,也可以用also函数进一步简化(保持可读性的前提下):
fun parseId(obj: WrappingObject): Long = obj.nullableNestedObject?.myId ?: throw InternalException("Id not found").also { logger.error("Id not found because of ...") }
方法二:使用 checkNotNull 标准库函数
Kotlin的checkNotNull专门用于检查内部状态合法性,空值时抛出指定异常,搭配它可以省去手动的if判断:
fun parseId(obj: WrappingObject): Long { return checkNotNull(obj.nullableNestedObject?.myId) { logger.error("Id not found because of ...") "Id not found" } }
checkNotNull的lambda会返回异常的错误信息,同时可以在里面执行日志输出逻辑。
补充:精准定位错误场景
如果需要区分是nullableNestedObject本身为null,还是其内部的myId为null(假设myId是可空类型),可以拆分开检查,更精准地定位问题:
fun parseId(obj: WrappingObject): Long { val nestedObj = obj.nullableNestedObject ?: run { logger.error("Nested object is missing") throw InternalException("Id not found") } return nestedObj.myId ?: run { logger.error("MyId is null in nested object") throw InternalException("Id not found") } }
内容的提问来源于stack exchange,提问作者Denis Stephanov
相关产品推荐
相关产品推荐

