前⾔
很多同学刚上⼿使⽤Kotlin知道它有针对Java NullPointerException的管理,⽽在Kotlin中?和!!均是和NullPointerException有关系,可他们的区别到底是什么呢?为什么别⼈开发的项⽬中出现了好多\"?\",⽽我读起来却满脸问号。不懂就问百度呀,确实有⼈解释它们的区别,⽐如:
这是输⼊\"kotlin ?和!!\"搜索到的百度第⼀条答案,确实这位说的没错。不过我觉得对于⼀个刚接触KT(Kotlin)的新⼿来说,他恐怕需要有汉语⼋级才能透彻理解这两句话的意思。先阐述两个概念:
\"?\"加在变量名后,系统在任何情况不会报它的空指针异常。\"!!\"加在变量名后,如果对象为null,那么系统⼀定会报异常!
在Java上出异常的,转化到KT上,编译器任然会让他保持抛出异常,NullPointerException也是如此。
所以结合上下⽂可以看得出,!!加上去后好像并没有和之前Java代码有什么区别嘛,该null的地⽅任然会抛出异常。所以⼤多数情况下都会使⽤?来检测null,轮不到!!出场。!!只会在你需要对某对象进⾏⾮空判断,并且需要抛出异常时才会使⽤到。那我们接下来着重讲解⼀下?到底怎么⽤。
在声明对象时,把它跟在类名后⾯,表⽰这个类允许为null;
在调⽤对象时,把它跟在对象后⾯,表⽰如果为null程序就会视⽽不见。如下列代码:
// 这是声明⼀个变量,问号跟在类名后⾯var room: Room? = Room()
private fun checkRoom() {
// 因为加上了问号,所以可以任意的把room变成空 room = null
// 因为在调⽤时加上了问号,所以程序不会抛出异常 Log.d(\"TAG\}
再举个不⽤?的例⼦:
// 这样程序就默认的给room加上了!!,从此以后room不允许为nullvar room: Room = Room()
private fun checkRoom() {
// 当把null赋给room时,从编译的时候就已经不通过 room = null
// 并且编译器建议把对象后⾯的问号删除,因为这个对象永远不为空 Log.d(\"TAG\}
所以加上?是⼀种安全的写法,它体现了Kotlin null safety的特性。KT的语法很灵动,定义参数还可以写成
val room: Room? = Room() // 先实例化⼀个room,并且room可以为空val room: Room? = null // 不实例化了,开始room就是空的
val room: Room = Room() // 实例化⼀个room,并且room永远不能为空val room = Room() // 和上⼀⾏代码⼀样,是KT最常⽤的简写语法
然⽽加上问号以后程序就万事⼤吉永远摆脱了NullPointerException的烦恼?我们再看下⼀段代码:
` val roomList: ArrayList Log.d(\"TAG\房间数不是0\") } ` 当我们判断list.size的时候,编译器会告诉我们\"Operator call corresponds to a dot-qualified call 'roomList?.size.compareTo(0)' which is not allowed on a nullable receiver 'roomList?.size'.\"。⼤概意思是,当roomList为null的时,它的size返回就是\"null\",但是\"null\"不可以和int值⽐⼤⼩,所以编译器建议我们写成roomList?.size!! > 0。 没错,经过编译器的建议加上了!!,我们程序运⾏到这⾏代码,roomList为null时它⼀定会报异常。所以是不是必须得在外⾯套⼀层if(roomList != null)这种Java常见语句才能避免异常吗? 当然Kotlin不会让程序出现这种啰嗦的代码,所以⾥⾯提供了对象A ?: 对象B表达式,并且取消了Java中的条件表达式 ? 表达式1 : 表达式2这个三元表达式。 :表⽰的意思是,当对象A值为null的时候,那么它就会返回后⾯的对象B。 `val roomList: ArrayList 总结 到此这篇关于Kotlin中?和!!区别的⽂章就介绍到这了,更多相关Kotlin中?和!!区别内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持! 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务