全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Kotlin null的处理详解

Kotlin null的处理详解

NullPointerException,俗称NPE,不管菜鸟还是老鸟们,都是不可避免,经常遇到的一个异常,解释起来很简单,就“空指针”三个字。总是在一次不小心,而掉进这个陷阱里。Kotlin 的设计目标就是希望消除代码中 null 引用带来的危险, 也就是所谓的造成十亿美元损失的大错误.

NPE的原因

尽管Kotlin希望消除代码中的NPE,我们总是不小心,总会不小心又掉进NPE的陷阱,下面是可能NPE的原因:

  1. 明确调用 throw NullPointerException()
  2. 使用 !! 操作符
  3. 外部的 Java 代码导致这个异常
  4. 初始化过程中存在某些数据不一致 (在构造器中使用了未初始化的 this)

避免NPE

在Kotlin中,明确区分可以指向 null 的引用 (可为 null 引用) 与不可以指向null的引用 (非null引用). 比如, 一个通常的 String 类型变量不可以指向 null:

var a: String = "abc"
a = null // 编译错误

此时,你对a变量的任何调用都是安全的,因为它为非null,你可以对该引用做任何操作而不会报NPE。就算对a赋值给Null,编译器都会报错,不会让你通过。

可是,实际开发时,不可能所有的变量不会null,总会有情况,变量是null的,此时该如何设定该变量呢?要允许null值的变量, 我们可以将变量声明为可为null的字符串, 写作 String? :

var b: String? = "abc"
b = null // ok

这样,我们是解决了变量可以设置为null的问题,可NPE的这个陷阱又设上了,如果再粗心大意,NPE又来找麻烦了。

如果我们仍然需要访问这个属性, 对不对? 有以下几种方法可以实现:

在条件语句中进行null检查

通过条件语句,对变量检查是否为null,对 null 和非 null 的两种情况分别处理:

if (b != null && b.length > 0)
  print("String of length ${b.length}")
else
  print("Empty string")

注:

该方案只是针对当前b的值,b的值在检查以后,如果b的值被修改仍需对此值做非null检查,也就是说每次修改b的值,都必须对b作非null验证,这也导致了代码的冗余。

安全调用

什么是安全调用?看起来有点不理解,既然是null怎么还会有安全呢?

b?.length

在Kotlin中,允许使用 “?.”操作符调用变量,其含义是如果b不是null,这个表达式将会返回b.length,否则返回 null.如果使用了”?.”,其表达式的值也应为 可为null的,比如Int?,否则编译器会报错。

bob?.department?.head?.name

安全调用在链式调用的情况下非常有用.这样的链式调用, 只要属性链中任何一个属性为 null, 整个表达式就会返回 null.

?:操作符

如果 ?: 左侧的表达式值不是null, 就会返回表达式的的值,否则, 返回右侧表达式的值.

val l = b?.length ?: -1

如果b不为null,将返回b的长度,如果为null,将返回-1

注:

只有在左侧表达式值为 null 时, 才会计算右侧表达式.

由于在 Kotlin 中 throw 和 return 都是表达式, 因此它们也可以用在 Elvis 操作符的右侧. 这种用法可以带来很大的方便, 比如, 可以用来检查函数参数值是否合法。

fun foo(node: Node): String? { 
val parent = node.getParent() ?: return null 
val name = node.getName() ?: throw IllegalArgumentException(“name expected”) 
// … 
} 

!! 操作符

对于b不为null的情况, 这个表达式将会返回这个非null值(比如, 在我们的例子中就是一个 String 类型值), 如果b是 null, 这个表达式就

会抛出一个 NPE:

val l = b!!.length()

当b为null时就抛出一个异常,你可以捕获它,而不是在不知道在某一角落里调用时,才报出异常,抓头挠腮半天,才找到NPE在哪里。

安全的类型转换

如果对象不是我们期望的目标类型, 那么通常的类型转换就会导致ClassCastException,可以选择使用安全的类型转换, 如果转换不成功, 它将会返回 null,这样避免了转换异常的抛出。

val aInt: Int? = a as? Int

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Kotlin  # null的处理  # null  # Kotlin浅析null操作方法  # 都是  # 就会  # 链式  # 将会  # 可为  # 抛出  # 不可以  # 而不  # 不为  # 报错  # 会报  # 掉进  # 是一个  # 使用了  # 是在  # 会有  # 让你  # 不可能  # 菜鸟  # 你可以 


相关文章: C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  javascript中的try catch异常捕获机制用法分析  网页设计网站制作软件,microsoft office哪个可以创建网页?  javascript中对象的定义、使用以及对象和原型链操作小结  建站之星如何快速生成多端适配网站?  山东云建站价格为何差异显著?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  css网站制作参考文献有哪些,易聊怎么注册?  如何在香港免费服务器上快速搭建网站?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  潮流网站制作头像软件下载,适合母子的网名有哪些?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  建站之星CMS五站合一模板配置与SEO优化指南  c# 在ASP.NET Core中管理和取消后台任务  如何在香港服务器上快速搭建免备案网站?  如何确保FTP站点访问权限与数据传输安全?  如何在Golang中指定模块版本_使用go.mod控制版本号  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  如何在宝塔面板创建新站点?  ,怎么用自己头像做动态表情包?  代刷网站制作软件,别人代刷火车票靠谱吗?  ,交易猫的商品怎么发布到网站上去?  济南网站制作的价格,历城一职专官方网站?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  建站之星安装模板失败:服务器环境不兼容?  如何通过智能用户系统一键生成高效建站方案?  建站上市公司网站建设方案与SEO优化服务定制指南  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  魔方云NAT建站如何实现端口转发?  如何快速启动建站代理加盟业务?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  建站之星后台密码遗忘如何找回?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  网站制作员失业,怎样查看自己网站的注册者?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  购物网站制作公司有哪些,哪个购物网站比较好?  建站之星安装提示数据库无法连接如何解决?  制作农业网站的软件,比较好的农业网站推荐一下?  大型企业网站制作流程,做网站需要注册公司吗?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  兔展官网 在线制作,怎样制作微信请帖?  如何在阿里云高效完成企业建站全流程?  ,在苏州找工作,上哪个网站比较好?  如何选择可靠的免备案建站服务器? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。