kotlin中的空指针检查问题
2022/3/5 23:16:44
本文主要是介绍kotlin中的空指针检查问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
空指针检查
Android系统上崩溃率最高的异常类型就是空指针异常。
我们需要知道的是:空指针是一种不受编程语言检查的运行时异常,只能有程序员主动通过逻辑判断来避免。
举个例子,对于一段简单的调用参数的Java代码,我们要使代码安全性更高,更稳妥的做法就是再调用参数的方法之前先进行一个判空处理。如下:
public void doStudy(Study study){ if(study !=null){ study.readBook(); study.doHomework(); }
可空类型系统
相较于Java,kotlin非常科学的解决了这个问题,它利用编译时判空检查的机制基弧杜绝了空指针异常。虽然编译时判空机制有时候导致代码更难书写,但kotlin提供的多种辅助工具可以很好的处理各种判空情况
在类名的后面加上一个问号,例如Int表示不可为空的整形,而Int?就表示可为空的整形。
判空辅助工具
?.操作符
对于上面的doStudy()函数,如果我们希望传入的参数可以为空,那么就可以如下进行实现:
fun main(){ doStudy(null) } fun doStudy(study:Study?){ study?.readbook() study?.doHomework() //注意当我们将参数修改为了可为空的Study?时,调用参数的readbook()和doHomework()方法都可能造成空指针异常,因此这种情况下就需要通过借助?.操作符将空指针异常都处理掉 }
?:操作符
这个操作符左右两边都接收了一个表达式,当左边表达式的结果不为空则返回左边表达式的结果,否则就返回右边表达式的结果
举例如下:
var m:String?="hello" var m2:String?=null fun main(){ var c1=m2?:m println(c1) } /* 上面这段代码中的 var c1=m2?:m 等价于如下代码: val c=if(m2!=null){ m2 } else{ m } */
非空断言工具
!!.操作符
当我们在main( )函数里先进行一次判空操作,里面调用一个函数。此时我们是无法通过编译的,因为调用的函数并不知道外部已经进行了非空检查,在调用函数时依旧认为这里面存在空指针风险,从而无法编译通过
这种情况下,我们想要强行通过编译,就可以使用非空断言工具,写法是在对象的后面加上!!,如下所示:
var m:String?="hello" fun main(){ if(m!=null){ printUpperCase() } } fun printUpperCase(){ val uppercase=m!!.toUpperCase() println(uppercase) }
需要注意的是这是一种有风险的写法,意在告诉kotlin,我非常确信这里的对象不会为空,所以不需要继续执行空指针检查;如果出现问题kotlin可以直接抛出异常,后果由我自己承担。
这篇关于kotlin中的空指针检查问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-01-06Kotlin委托属性(1)
- 2023-06-15Kotlin协程-那些理不清乱不明的关系
- 2023-06-08[Kotlin Tutorials 21] 协程的取消
- 2023-05-26Kotlin难点
- 2023-02-23【备战春招】第16天 Kotlin实用技巧
- 2023-02-23【备战春招】第15天 Kotlin扩展Extensions技术探秘
- 2023-02-22【备战春招】第14天 深入理解Kotlin注解
- 2023-02-21【备战春招】第12天 深入理解Kotlin类与接口
- 2023-02-21【备战春招】第13天 深入理解Kotlin泛型
- 2023-02-18【备战春招】第10天 Kotlin方法与Lambda表达式