💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### **?.(安全调用符)** 安全调用运算符“?.”:它允许你把一次null检查和一次方法调用合并成一个操作。 Kotlin提供了一个安全调用符“?.”,**专门用于调用可空类型变量中的成员方法或属性**,其语法格式为“变量?.成员”。其作用是判断变量是否为null,如果不为null才调用变量的成员方法或者属性。 安全调用符的出现解决了什么问题? 可空类型变量不能直接使用,但是直接使用非空判断又过于复杂,所以可以使用安全调用符。 **怎么使用安全调用符**?之前的结构是【变量.方法】,现在的结构是【**变量?.方法**】。 使用了安全调用符,代码执行逻辑是怎样的? **变量不会NULL的时候,才去执行方法,所以不会报空指针。变量为NULL的时候,【变量?.方法】的结果为NULL**,参考下图: ![](https://i.loli.net/2019/04/21/5cbb5da74d290.png) **其实可以把安全调用符看做是if非空判断的简写形式**, 也就是`varresult = if (age != null) age.toInt() else null`等同于`var result = age?.toInt()`。 如果age变量为null,请使用安全调用符参考代码: ~~~ fun main(args: Array<String>) { //可空类型变量 var age: String? = null //使用安全调用符 val result = age?.toInt() //打印结果 println(result) //随便打印一句话 println("安全调用符后面的一句话") } ~~~ 运行结果 ``` null 安全调用符后面的一句话 Process finished with exit code 0 ``` 如果age变量不为null,使用安全调用符,参考代码: ~~~ fun main(args: Array<String>) { //可空类型变量 var num: String? = "18" //使用安全调用符 val res = num?.toInt() //打印结果 println(res) //随便打印一句话 println("安全调用符后面的一句话") } ~~~ 运行结果 ``` 18 安全调用符后面的一句话 Process finished with exit code 0 ``` 安全调用不光可以调用方法, 也能用来访问属性,同时链接多个安全调用 ~~~ /** * 安全调用符(?.) * 一、使用安全调用处理可空属性 * 二、链接多个安全调用 */ class Employee(val name:String,val manager:Employee?) fun managerName(employee: Employee):String?=employee.manager?.name class Address(val streetAddress:String,val zipCode:Int,val city:String,val country:String) class Company(val name:String,val address: Address?) class Person(val name: String,val company: Company?) fun Person.countryName():String{ val country=this.company?.address?.country return if (country !=null) country else "Unknown" } fun main(args: Array<String>) { //一、使用安全调用处理可空属性 val ceo=Employee("Big Boss",null) val developer=Employee("Bob Smith",ceo) println(managerName(developer)) println(managerName(ceo)) //二、链接多个安全调用 val person=Person("Dmitry",null) println(person.countryName()) } ~~~ 运行结果 ``` Big Boss null Unknown Process finished with exit code 0 ```