空指针检查
以下代码不安全
public void doStudy(Study study){
stduy.readbood()
study.doHomework()
}
应该加一个判空条件判断
public void doStudy(Study study){
if (study!=null)
{
stduy.readbood()
study.doHomework()
}
}
可空类型系统
这种情况在kotlin就可以避免
fun doStudy(study: Study){
study.readBooks()
study.doHomework()
}
//因为kotlin默认所有的参数和变量都不为空
也就是说,kotlin的判空机制提前到了编译时期,当我们的程序有存在空指针的异常时,编译器会直接报错。
但是如果我们需要指针为空那怎么办?
于是就有了可空类型系统,只需要在类名或者变量后加一个问号 **?**即可
fun main(){
doStudy(null)
}
fun doStudy(study:Study?){
study.readBooks()
study.doHomework()
}//加问号后代表此变量可以为空
这时候就需要进行检查,也就是需要主动判空。
fun main(){
doStudy(null)
}
fun doStudy(study:Study?){
if (study!=null)
{
stduy.readBook()
study.doHomework()
}
}
判空辅助工具
最常用的是**?.**
作用是当对象不为空时正常操作。当对象为空时什么都不做。
上面的代码可以改成
fun doStudy(study:Study?)
{
study?.readBook()
study?.doHomework()
}
另一个常用的是 **?:**操作符,左右两边都接受一个表达式,如果左边不为空就返回左边表示的结果,否则就返回右边表达式的结果
val c=a?:b
如果非常确信某对象不为空,应该使用**!!.**关键字
let函数
这个函数提供了函数式API的编程接口,并将原始对象作为参数传递到lambda表达式中
obj.let{ obj2 ->
//具体逻辑,这里的obj2是为了避免混淆,其实他跟obj是同一个对象
}
与判空结合起来可以这么写
fun doStudy(study:Study?){
study?.let{
stu-> stu.readBook()
stu.doHomework()
}
}
//意思是当study不为空时将study作为参数传递到lambda中
另外,let语句可以处理全局变量的判空问题,但是if不行
![](https://i-blog.csdnimg.cn/blog_migrate/0a8c81d540b3c598d1f25757bead9f10.png)
其他小技巧
字符串内嵌表达式
什么是内嵌表达式呢?与之对应是java的字符串拼接。
val brand = "Samsung"
val price = 1299.99
println("Cellphone(brand="+brand+"",price="+price+")")
可以看到可读性非常差而且很费力,在kotlin中就不会有这种烦恼,可以直接在字符串内嵌表达式
val brand = "Samsung"
val price = 1299.99
println("Cellphone(brand=$brand,price=$price)")
语法规则如下
str = "hello ${obj.name}"
//只有一个变量时可以去掉括号
str = "hello $name"
函数的参数默认值
fun printParams(num:Int,str:String = "hello")
{
...}
直接在括号内修改即可。