🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### **!!(非空断言)** 非空断言的出现为了解决什么问题?可空类型变量不能直接使用,但是直接使用非空判断又过于复杂,所以还可以使用非空断言。怎么使用非空断言?之前的结构是【变量.方法】,现在的结构是【**变量!!.方法**】。 使用非空断言,代码执行逻辑是怎样的?**变量不为NULL的时候,执行方法,变量为NULL的时候,抛出异常**,非空断言(!!.)会将任何变量(可空类型变量或者非空类型变量)转换为非空类型的变量,若该变量为空则抛出异常。参考下图: ![](https://i.loli.net/2019/04/20/5cbb2e61b43d6.png) 通过使用非空断言,如果值为null,可以显式地抛出异常 * 如果变量age为null  ~~~ fun main(args: Array<String>) { //可空类型变量 var age: String? = null //使用非空断言修饰符 val result = age!!.toInt() //打印结果 println(result) //随便打印一句话 println("非空断言修饰符后面的一句话") } ~~~ 运行结果 ``` Exception in thread "main" kotlin.KotlinNullPointerException at day02.非空断言Kt.main(非空断言.kt:14) Process finished with exit code 1 ``` 可以看出,代码走到15行的时候就抛出异常了,15行后面的代码没有执行了。 **注意:异常抛出的位 置是非空断言所在的那一行,而不是接下来试图使用那个值的一行** * 如果变量age不为null  ~~~ fun main(args: Array<String>) { //可空类型变量 var age: String? = "18" //使用非空断言修饰符 val result = age!!.toInt() //打印结果 println(result) //随便打印一句话 println("非空断言修饰符后面的一句话") } ~~~ 运行结果 ``` 18 非空断言修饰符后面的一句话 Process finished with exit code 0 ``` >[info]注意:还有一个需要牢记的注意事项: 当你使用!!并且它的结果是异常时, 异常调用栈的跟踪信息只表明异常发生在哪一行代码,而不会表明异常发生在哪一个表达式。为了让跟踪信息更清晰精确地表示哪个值为null,最好避免在同一行中使用多个!!断言,如下就是错误的代码`person.company!!.address!!.country`,这是错误的 **安全调用符和非空断言如何选择?** 1. 从安全角度,**安全调用符比非空断言更加安全**。变量为NULL的时候,使用安全调用符不会抛出异常,使用非空断言,会抛出异常。 2. **非空断言的做法是不推荐的**,一个可空类型变量,加上非空断言,可以理解为开发者就是认定一个可空的变量为非空的,这显得有些霸道,不够和谐(大笑)。 3. 安全调用符和非空断言的对比如下 ![](https://img.kancloud.cn/f6/94/f694cdda90366f7e24e01b082697dfc5_1360x225.png)