当前位置: 首页 > news >正文

开发区网站建设/廊坊百度关键词排名平台

开发区网站建设,廊坊百度关键词排名平台,抖音代运营多少钱,长沙传媒公司招聘1. 空指针检查 这里先定义一个Study接口://定义Study接口 interface Study { //readBooks()方法fun readBooks()//doHomeWork()方法fun doHomeWork(){println("Im doing homework now.")} }这里定义了学生类来实现接口://主函数 fun main() { } //Person类 有name和…

1. 空指针检查

这里先定义一个Study接口:
//定义Study接口
interface Study {
//readBooks()方法fun readBooks()//doHomeWork()方法fun doHomeWork(){println("I'm doing homework now.")}
}
这里定义了学生类来实现接口:
//主函数
fun main() {
}
//Person类 有name和age字段
open class Person(val name: String, val age: Int) {}
//学生类 继承了Person类 实现了Study接口
class Student(name: String, age: Int) : Person(name, age), Study {override fun readBooks() {println("$name is reading")}}
//定义了一个实现 Study接口中的方法的方法
fun doStudy(study: Study) {study.readBooks()study.doHomeWork()
}
我们来看这个方法:
fun doStudy(study: Study) {study.readBooks()study.doHomeWork()
}
这个方法一定安全吗,如果我们向doStudy()传入了一个null参数,
那么这里毫无疑问会发生空指针异常,因此,更加稳妥的方法是:
fun doStudy(study: Study) {if (study != null) {study.readBooks()study.doHomeWork()}
}
这样就可以保证不管传入的参数是什么,这段代码始终都是安全的.
可见,这么一小段代码都有可能发生空指针异常,在一个大型项目中,
想要完全避免非空指针几乎是不可能的事情,这也是它高居各类崩溃排行榜首位的原因.

在这里插入图片描述

Kotlin给我们提供了一套可为空的类型:在类名的后面加上一个问号就行了.
如Int表示不可为空的整型,而Int?表示可为空的整型.

在这里插入图片描述

现在代码就可以正常编译通过了,并且完全不会出现空指针异常.

2. 判空辅助工具

2.1 ?.操作符:

当对象不为空时正常调用相应的方法,当对象为空时则什么都不去做
比如下面代码:
fun main() {val student = Student("Tom", 18)if (student != null) {student.doSomething()}
}
可以简化为:
    val student = Student("Tom", 18)student?.doSomething()
可以看见我们借助?.操作符就省去了if判断语句,
你现在可能觉得没什么,但当以后进入大型项目的时候,这点就非常有用了.

2.2 ?:操作符

这个操作符左右两边都接收一个表达式
如果左边表达式不为空就返回左边表达式的结果,
否则就返回右边表达式的结果.例如:
    var c = if (a != null) {a} else {b}
这段代码可以简化为:
 val c = a ?: b
接下来我们通过具体的例子来结合使用
?.和?:操作符,从而加深你对他们的理解.
我们现在要编写一个函数用来获取文本的长度,
按照传统的方法你可以这样写:
fun getTextLength(text: String?): Int {if (text != null) {return text.length}return 0
}
这段代码可以简化为:
fun getTextLength(text: String?) = text?.length ?: 0
由于text可能是空的,因此我们在调用它的length字段时需要使用
?.操作符,而当text为空时 text?.length会返回一个null值,
这个时候我们再去借助?:操作符使它返回0.

不管Kotlin的空指针检查机制也不是完美的, 
有的时候我们逻辑上面已经将空指针异常处理了,
但是Kotlin编译器并不知道,这个时候它还是会编译失败.

在这里插入图片描述

因为printUpperCase()函数并不知道外部已经对content变量进行了非空检查,
在调用printUpperCase()方法室,还认为这里存在空指针异常,所有无法通过.
在这种情况下,我们可以使用非空断言工具,写法是在对象的后面加上!!
fun printUpperCase() {val upperCase = content!!.toUpperCase()println(upperCase)
}
这是一种有风险的写法,表明自己非常确信这里的对象不为空.

2.3 let辅助工具

最后我们来学习let辅助工具:

let并不是关键字,也不是操作符,而是一个函数.
这个函数提供了函数式API的编程接口,
并且将原始调用对象作为参数传递到Lambda表达式中.

示例代码:

obj.let{obj2 -> //编写具体的业务逻辑
}
这里调用了obj对象的let函数, 然后再Lambda表达式中的代码就会立即执行,
并且这个obj对象还会作为参数传入到Lambda表达式,不过为了防止变量重名,
这里我将参数名改为了obj2,但实际上他们是同一个对象,
这就是let函数的作用.我们回到doStudy()函数里:
fun doStudy(study: Study?) {study?.readBooks()study?.doHomeWork()
}
虽然可以编译通过,但这种方式有点啰嗦,这段代码如果使用if语句就会变成:
fun doStudy(study: Study?) {if (study != null) {study.readBooks()}if (study != null) {study.doHomeWork()}
}
这就是说,我们每进行一次if判断就可以随意调用study对象的任何方法
就可以随意调用study对象的任何方法, 
但受限制与?.操作符, 现在每调用一次study对象的方法都要进行一次if判断.

接下来我们使用?.操作符结合let函数来对代码进行优化:

fun doStudy(study: Study?) {study?.let { study ->study.readBooks()study.doHomeWork()}
}
?.操作符表示对象为空时什么也不做,
对象不为空时就调用let函数,而let函数会将study对象本身作为参数传递到
Lambda表达式中,此时对象肯定不为空,我们就可以放心得调用它的任意方法了.Lambda表达式中,如果参数只有一个,则可以使用it关键字替代,所以代码可以简化为:
fun doStudy(study: Study?) {study?.let {it.readBooks()it.doHomeWork()}
}
let函数是可以处理全局变量的判空问题的,而if条件语句则无法做到这一点:

使用let不报错:
在这里插入图片描述
使用if报错:
在这里插入图片描述

之所以会报错,是因为全局变量随时都有可能被其他线程修改,即使做了非空判断,
也无法保证if语句中的study没有空指针风险.从这一点也可以看出let函数的优势.



http://www.lbrq.cn/news/1303345.html

相关文章:

  • 小网站文案/武汉关键词排名工具
  • wordpress 抓取/网站如何优化排名软件
  • 网站建设用英语怎么说/学校网站模板
  • 网站排名第一/百度联系方式人工客服
  • 个人做网络推广哪个网站好/销售的技巧与口才
  • 2014 网站建设/如何优化企业网站
  • 如何快速提高网站权重/百度广告投放平台官网
  • 个人做网站报价/网站推广推广
  • 自己做店铺网站/百度搜索的优势
  • 幼儿园网站怎么做的/项目外包平台
  • asp动态网站制作流程/上海野猪seo
  • 响应式网站排版/浑江区关键词seo排名优化
  • 做网站资源/建网站的公司排名
  • 上海网站建设公司 珍岛/百度网站排名关键词整站优化
  • 成都旅游景点攻略/山西seo排名厂家
  • wordpress 搜索 404/seo工具网站
  • 陕西网站建设托管/网站收录什么意思
  • 只建设电子商务网站不维护/点击排名软件哪个好
  • 哈尔滨工程信息网/百度 seo优化作用
  • 海南网站建设网站开发小程序app/软文是什么东西
  • 邯郸做wap网站找谁/html网页制作网站
  • 如何做外贸网站/产品软文范例大全
  • 网站建设页面生成/平台推广是做什么的
  • 手机网站安全证书过期怎么处理/站长之家怎么找网址
  • pc端网站生成wap版/网站视频播放代码
  • wordpress网站程序员/潍坊网站外包
  • 专门做视频的网站有哪些/百度怎么推广自己的信息
  • 江苏城乡住房和城乡建设厅网站/杭州百度推广代理商
  • 网站微信分享链接怎么做的/站长素材官网免费
  • 浙江省建设监理协会管网站/一句话宣传自己的产品
  • React 实现人员列表多选、全选与取消全选功能
  • springCloud -- 微服务01
  • Java大厂面试实录:从Spring Boot到AI微服务架构的深度解析
  • 黑马Node.js全套入门教程,nodejs新教程含es6模块化+npm+express+webpack+promise等_ts对象笔记
  • Linux C 进程基本操作
  • 下载anaconda和pycharm,管理python环境