Kotlin 中的?.和.语法详解一句话总结语法名称作用.成员访问操作符直接访问对象的属性或方法?.安全调用操作符对象不为 null 时才访问为 null 则返回 null1..成员访问操作符普通调用这是最基础的语法和 Java、Python 等语言一样用来访问对象的属性和方法valname:StringKotlin// 用 . 访问属性println(name.length)// 6// 用 . 调用方法println(name.uppercase())// KOTLIN但是如果对象可能为 nullvalname:String?null// 可空类型// name.length // ❌ 编译错误可空类型不能直接用 . 调用编译器会直接报错不让你编译通过因为如果name是null调用.length就会空指针崩溃。2.?.安全调用操作符Safe Call?.就是为了解决上面的问题而设计的它的逻辑很简单如果对象不为 null → 正常调用如果为 null → 直接返回 null不崩溃valname:String?nullvallength:Int?name?.length// name 是 null → 不调用 .length → 直接返回 nullprintln(length)// null没有崩溃valname:String?Kotlinvallength:Int?name?.length// name 不是 null → 正常调用 .lengthprintln(length)// 63. 直观对比valuser:User?null// ❌ 用 . —— 编译器直接报错不让你这样写// user.name// ✅ 用 ?. —— 安全返回 nulluser?.name// 结果是 null// ✅ 用 . —— 但前提是类型不可空valuser2:UserUser(Alice)user2.name// 结果是 Alice你可以把?.理解为一个简写// 这两种写法完全等价// 写法1用 ?.valresultuser?.name// 写法2手动判断 nullvalresultif(user!null){user.name}else{null}4.?.链式调用?.最强大的地方是可以链式使用任何一环为 null 就直接短路返回 nullclassAddress(valcity:String?)classCompany(valaddress:Address?)classUser(valcompany:Company?)valuser:User?User(Company(Address(北京)))// 链式安全调用valcity:String?user?.company?.address?.cityprintln(city)// 北京// 任何一环为 null整个结果就是 nullvaluser2:User?User(Company(null))valcity2:String?user2?.company?.address?.cityprintln(city2)// nulladdress 是 null后面就不再调用了如果不用?.你需要写大量嵌套判断// 不用 ?.又丑又长valcityif(user!null){if(user.company!null){if(user.company.address!null){user.company.address.city}elsenull}elsenull}elsenull5. 常见搭配搭配?:Elvis 操作符—— 给个默认值valname:String?null// 如果 name 为 null就用 未知 代替valdisplayNamename?:未知println(displayName)// 未知// 组合使用vallengthname?.length?:0println(length)// 0搭配?.let—— 不为 null 时执行代码块valemail:String?hellokotlin.orgemail?.let{println(发送邮件到:$it)// 只有 email 不为 null 才执行}6. 总结图示对象.属性 ← 普通调用对象必须非空 对象?.属性 ← 安全调用对象可空 ┌─ 不为 null → 正常调用返回结果 对象?.属性 ─────┤ └─ 为 null → 跳过调用返回 null一句话记忆.是我确定它不是 null直接访问?.是它可能是 null帮我安全地试一下后记2026年5月18日于上海在claude opus 4.6辅助下完成。