Kotlin中对空的很多处理

代码图片直观效果

逐行解释Kotlin中对空的各种情况的使用

复制代码
  private fun testNull() {
        val flag = 1
        var name: String? = null
        var user: User? // 有警告, 因为下面的赋值可以和这一行定义合并
        var zhangUser: User? = User()
        var wangUser: User = User() // 提示Explicitly given type is redundant here, 不用写第一个User
        var liUser = User()
        val tag = TAG // 这个小写的tag编译器没有设置下划线, 因为它是val类型不可修改
        Log.e(tag, "zhangUser: ${zhangUser?.account_name}") // 必须加问号
        Log.e(TAG, "wangUser: ${wangUser.account_name}") // 可以加问号, 可以加!!, 但是没必要
//        Log.e(TAG, "user: ${user?.account_name}") // 不能使用必须先赋值, 哪怕赋值为空
        user = null
        Log.e(TAG, "user: ${user?.account_name}") // 不报错, 但是警告, 因为编译器知道它是空, 已经推断出调用结果
//        wangUser = null // 不能赋值为空, 因为定义的时候就是不可能为空
        wangUser = User() // 可以改变, 因为不是val类型
        zhangUser = null // 可以赋值为空, 因为定义的时候就是可为空类型(User?)

//        println(zhangUser.account_name) // 不能这样调用, 因为可能为空
        if (zhangUser != null) {
            println(zhangUser.account_name) // 因为外层已经判断出不为空, 所以可以直接调用
        }
        if (flag == 1) { // 编译器不会检索if{}里面的代码对变量的影响, 对于{}以外的代码可能不知道这个值<可能为空>与否
            zhangUser = User()
        }
//        println(zhangUser.account_name) // 因为zhangUser可能为空, 所以这样可能报错
        println(zhangUser?.account_name) // 这种方式经常可以, 对于可为空对象是很好的办法
        println(zhangUser!!.account_name) // 不能推断内部的if{}下面对于变量的处理, 所以是否为空不确定
        println(zhangUser.account_name) // 因为上面的代码已经用!!假设了不可能为空, 相当于已经经过了一次assert操作, 如果出错上一步已经出了
    }
    class User {
        var account_name = "User" // 这一行代码也有警告"不要使用下划线", 但是PHP后端经常会使用下划线命名规则, 如果客户端还做一次转化浪费开发效率
    }
相关推荐
阿巴斯甜4 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker5 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95276 小时前
Andorid Google 登录接入文档
android
黄林晴7 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab20 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android