ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

kotlin中的空指针检查问题

2022-03-05 22:31:35  阅读:201  来源: 互联网

标签:检查 kotlin study 操作符 m2 var 指针


空指针检查

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,study,操作符,m2,var,指针
来源: https://www.cnblogs.com/lxrnb/p/15969685.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有