kotlin-null判断总结
kotlin-null判断总结 - 简书 (jianshu.com)
Kotlin 空安全(null-safety):再见 NullPointerException (qq.com)
1.?和!!
"?"加在变量名后,系统在任何情况不会报它的空指针异常。
"!!"加在变量名后,如果对象为null,那么系统一定会报异常!
定义变量时,可在类型后面加一个问号?,表示该变量是Nullable,不加表示该变量不可为null。如下
var s:String? = null
var s2:String = "xxx" //如果该变量被赋值为null,则编译不通过
从中可以看出,在为变量s设置值的时候,是直接赋值的;而为变量s2赋值的时候,首先进行了非空判断,这保证了s2不可能为null。
对于可以为null的变量,在使用该变量的时候,必须用变量名+?(如上面的s?)的形式进行调用,表示如果该变量为null,则不执行该变量调用的方法。如:
s = "yyy"//赋值时不需要使用s?形式
var l= s?.length//如果s为null,则不执行length方法
当s为null时,不会执行length方法,从而避免了java中频繁的空指针异常。
嗯嗯嗯 Kotlin 针不错
Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两
种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理
返回值为 null或配合?:做空判断处理
//类型后面加?表示可为空
var age: String? = "23"
//抛出空指针异常
val ages = age!!.toInt()
//不做处理返回 null
val ages1 = age?.toInt()
//age为空返回-1
val ages2 = age?.toInt() ?: -1
open 关键字
在Kotlin开发中类和方法默认不允许被继承和重写,等同于Java中用 final 修饰类和方法。
如果在Kotlin 中类和方法想被继承和重写,需添加open 关键字修饰。
lateinit的作用:延迟初始化,只能修饰var, 不能对 java
基本类型使用,例如:Double
、Int
、Long
等;
lateinit
不能对可空类型使用
具体来讲,这个关键字告诉编译器,我无法声明的时候就初始化,但是我保证我在使用前一定会初始化,你就别给我检查了
lateinit var a1: String
lazy也是延迟初始化,只能修饰val,
lazy
的加载时机为第一次调用常量的时候,且只会加载一次(毕竟是个常量,只能赋值一次)
val lazyValue: String by lazy { println("computed!") "Hello" }
{}
中的最后一行代码,需要返回初始化的结果,上述代码中,"
Hello"
即为最后初始化的值。
private val mUserMannager: UserMannager by lazy { UserMannager.getInstance() }
let
let扩展函数的实际上是一个作用域函数,当你需要去定义一个变量在一个特定的作用域范围内,let函数的是一个不错的选择;let函数另一个作用就是可以避免写一些判断null的操作。
object.let{
it.todo()//在函数体内使用it替代object对象去访问其公有的属性和方法
...
}
//另一种用途 判断object为null的操作
object?.let{//表示object不为null的条件下,才会去执行let函数体
it.todo()
}
Kotlin系列之let、with、run、apply、also函数的使用_熊喵先生的博客-CSDN博客_kotlin let函数
::
Kotlin 中 双冒号操作符 表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法。
详情参考:https://blog.csdn.net/lv_fq/article/details/72869124
object关键字总结
object关键字主要有三种使用场景
- 对象声明(object declaration) 一般 用于单例
- 伴生对象(companion object) 相当于static 与companion一起用
- 对象表达式(object expression) 相当于一个new
- https://www.jianshu.com/p/1a0cf2ca87cc