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后端经常会使用下划线命名规则, 如果客户端还做一次转化浪费开发效率
    }
相关推荐
zhangyao94033028 分钟前
关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。
开发语言·javascript·excel
骑驴看星星a35 分钟前
【Three.js--manual script】4.光照
android·开发语言·javascript
星释2 小时前
Rust 练习册 :Leap与日期计算
开发语言·后端·rust
悟能不能悟3 小时前
java的java.sql.Date和java.util.Date的区别,应该怎么使用
java·开发语言
循环过三天4 小时前
3.4、Python-集合
开发语言·笔记·python·学习·算法
_院长大人_5 小时前
设计模式-工厂模式
java·开发语言·设计模式
MATLAB代码顾问5 小时前
MATLAB实现决策树数值预测
开发语言·决策树·matlab
不染尘.6 小时前
2025_11_7_刷题
开发语言·c++·vscode·算法
似水এ᭄往昔7 小时前
【C++】--stack和queue
开发语言·c++
TDengine (老段)7 小时前
TDengine 字符串函数 CONCAT_WS 用户手册
android·大数据·数据库·时序数据库·tdengine·涛思数据