Kotlin 初学者常见错误:如何避免它们

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin 初学者常犯的顶级错误:如何避免并编写整洁代码



Kotlin 是一种现代、简洁且安全的语言,在 Android 开发和后端领域迅速流行起来。然而,它的灵活性和语法糖常常误导初学者。在本文中,我们将探讨 Kotlin 初学者常犯的 4 个典型错误,并通过代码示例展示如何修复它们。



1. 忽视空安全以及错误使用 !! 运算符



Kotlin 的主要特性之一是 空安全。但许多习惯于 Java 的初学者会无意识地使用 !!(非空断言运算符)。这是一条通往 NullPointerException 的直接路径。



错误的示例:

fun getUserName(user: User?): String {    return user!!.name // 如果 user == null,将会出现 NPE}


正确的示例(安全处理可空类型):

fun getUserNameSafe(user: User?): String {    return user?.name ?: "Unknown user"}


使用 ?.let{}、?:(Elvis 运算符)和 ?.run{} 进行安全访问。只有在极少数情况下,当你 100% 确定值不为 null 时(例如在测试中),才合理使用 !! 运算符。



2. 密封类与 when 的错误使用



密封类是建模受限层次结构的强大工具。但初学者常常忘记,在处理密封类时 when 必须是详尽的。或者,他们会在不需要的地方使用 else。



错误的示例(缺少分支):

sealed class Result {    data class Success(val data: String) : Result()    data class Error(val message: String) : Result()}

fun handleResult(result: Result) { when (result) { is Result.Success -> println(result.data) // Error 分支缺失 — 将出现警告 }}


正确的示例(详尽的 when):

fun handleResultExhaustive(result: Result) {    when (result) {        is Result.Success -> println(result.data)        is Result.Error -> println(result.message)    }    // 编译器不需要 else,因为所有选项都已覆盖}


如果你向密封类添加新的分支,编译器会告诉你需要在哪些地方更新 when。这可以保护代码在重构时免受错误影响。



3. 过度使用协程:在不指定上下文的情况下启动并忽略结构化并发



协程是处理异步操作的好方法,但初学者常常在没有正确上下文的情况下启动它们,或者忘记结构化并发。这会导致内存泄漏和不受控制的后台任务。



错误的示例(全局作用域和上下文丢失):

fun loadData() {    GlobalScope.launch { // 糟糕!只要应用运行,它就存在        val data = fetchData() // 可能在 Activity 销毁后执行        updateUI(data) // 错误:UI 已销毁    }}


正确的示例(使用 viewModelScope 的结构化并发):

class MyViewModel : ViewModel() {    fun loadData() {        viewModelScope.launch {            val data = fetchData()            updateUI(data) // 当 ViewModel 被清除时自动取消        }    }}


始终使用 coroutineScope、viewModelScope 或你自己的具有清晰生命周期的 CoroutineScope。在生产代码中避免使用 GlobalScope。



4. 在不理解语义的情况下重载运算符



Kotlin 允许重载运算符(+、-、in

博客

书籍推荐