IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【Kotlin】kotlin中的空指针检查 -> 正文阅读

[移动开发]【Kotlin】kotlin中的空指针检查

kotlin学习-空指针检查

1.Java

在java代码中,经常会有空指针报错,方法传参,对数据进行操作,或者调用集合,都有可能发生空指针,一般的操作是加一个判空处理

2.kotlin-可空类型系统

**在kotlin中,默认所有的参数和变量不可为空,**如果传空,则就会有空值的提示,也就是说kotlin将空指针异常提前到了编译时期,如果程序存在空指针异常,那么在编译的时候就会直接报错

可空类型系统就是在变量的 后面加一个?

例如:Int ?表示可空 的整型 Int就不能为空

fun main() {//伪代码
    
        doStudy(null)
        
}
fun doStudy(study : Study?){
    study.readBooks()
    study.doHomework()
}

这里Study加了?,所以是允许传空值的,但是调用方法的时候可能会造成空指针异常,所以kotlin会提示报错,而我们只需要添加一个判空处理就好了,因为kotlin是不允许在这种情况下编译通过的

fun main() {
    
        doStudy(null)
        
}
fun doStudy(study : Study?){
    if(study ! =null){
    study.readBooks()
    study.doHomework()
    }
    
}

3.判空辅助工具

1. ?.

?.这个操作符很好理解,就是当对象不为空时正常调用相应的方法,当对象为空时则什么都不做

例如:

if(a ! =null){
   
       a.dosth
    }

就可以换成

 a?.dosth

简化之前的代码

fun doStudy(study : Study?){
    
    study?.readBooks()
    study?.doHomework()
   
    
}

2. ?:

这个操作符的左右两边都接收一个表达式,如果左边表达式的结果不为空就会返回左边表达式的结果,否则就返回右边表达式的结果

例如:

 val c =if (a!=null){
     a
 }else{
     b
 }

简化之后就是

val c =a ?: b

结合起来用就是

例如:

fun getTextLenth(text:String?):Int{
    if(text !=null){
        return test.length
    }
    return 0
}

简化之后就是

fun getTextLenth(text:String?)=text?.length ?:0

先判空,为空就返回 0

3. !!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3IJGy9Ib-1627106636565)(https://bytedance.feishu.cn/space/api/box/stream/download/asynccode/?code=MDU4ZGU1OGJjZjI1ZTU3YTcyZWQyOTlhZjFhZmFhOTVfMGpXRjE4amRJRnpXdEdGTm02NUp2em9YTW9IT2ZNaFZfVG9rZW46Ym94Y25XOVJKRHNHZVY3bm5Cd1NkdWM0QTdlXzE2MjcxMDY2MDk6MTYyNzExMDIwOV9WNA)]

我们可以做此修改

val upperCase = content!!.toUpperCase()

在这里printUpperCase函数并不知道外部已经对content变量进行了非空检查,在调用toUpperCase()方法时,还认为这里存在空指针风险,从而无法编译通过

所以我们可以通过非空断言工具,就是在对象后面加上!!

这是一种有风险的写法

4.let

let是一个函数,这个函数提供了函数式API的编程接口,并将原始调用对象作为参数传递到Lambda表达式中

例如:

 fun main(){
    obj.let{obj2 ->
        //编写业务逻辑代码
    }
}

obj其实就是obj2,这里是为了防止重名

回到之间的doStudy函数中

就是这这个

fun doStudy(study : Study?){
    
    study?.readBooks()
    study?.doHomework()
   
    
}

本来我们进行一次if判断就可以搞定,但是这里要用?.,所以对应的就是要进行两次判空操作

所以我们就可以结合let和?.来对代码进行优化

fun doStudy(study : Study?){
    
    study?.let{stu ->
        stu.readBooks()
        stu.doHomework()
    }

}

这里就是?.操作符表示对象为空时什么都不做,对象不为空就调用let函数,而let函数会将study对象本省作为参数传递到Lambda表达式中,此时的study对象肯定不为空了。

加上Lambda特性,当Lambda表达式的参数列表中只有一个参数时,可以不用声明参数名,直接使用it关键字来代替即可

fun doStudy(study : Study?){
    
    study?.let{
        it.readBooks()
        it.doHomework()
    }
   
}

最后就是,let函数是可以处理全局变量的判空问题的,而if判断语句则无法做到这一点。

var study : Study?=null
fun doStudy(){
    
    if(study != null){
        study.readBooks()
        study.doHomework()
    }
   
}

之所以这里报错,是因为全局变量的值随时都有可能被其他线程所修改,即使做了判空处理,仍然无法保证if语句中study变量没有空指针风险

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:12:28  更:2021-07-26 12:14:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/19 14:39:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码