Kotlin(十) 空指针检查、字符串内嵌表达式以及函数默认值

news2025/1/4 17:30:28

空指针检查

我们在之前的章节里,有定义一个Study的类,它有两个函数,一个doHomework(),一个readBooks()。然后我们定义个doStudy函数,来调用它们,代码如下:

fun doStudy(study: Study) {
    study.doHomework()
    study.readBooks()
}

这一串代码,看上去会有空指针错误,但实际上是没有的,因为Kotlin默认所有的参数和变量都不可为空,所以这里传入的Study参数也一定不会为空,我们可以放心地调用它的任何函数。如果你尝试传入null,那么编译器会直接报错。

也就是说,Kotlin将空指针异常的检查提前到了编译时期,如果我们的程序存在空指针异常的风险,那么在编译的时候会直接报错,修正之后才能成功运行,这样就可以保证程序在运行时期不会出现空指针异常了。

看到这里,你可能产生了巨大的疑惑,所有的参数和变量都不可为空?这可真是前所未闻的事情,那如果我们的业务逻辑就是需要某个参数或者变量为空该怎么办呢?不用担心,Kotlin提供了另外一套可为空的类型系统,只不过在使用可为空的类型系统时,我们需要在编译时期就将所有潜在的空指针异常都处理掉,否则代码将无法编译通过。

那么可为空的类型系统是什么样的呢?很简单,就是在类名的后面加上一个问号。比如,Int表示不可为空的整型,而Int?就表示可为空的整型;String表示不可为空的字符串,而String?就表示可为空的字符串。

回到刚才的doStudy()函数,如果我们希望传入的参数可以为空,那么就应该将参数的类型由Study改成Study?,如图:

当你在参数加上?之后,发现调用的函数报错了,因为此时调用参数的readBooks()doHomework()方法都可能造成空指针异常,因此Kotlin在这种情况下不允许编译通过。

那么该如何解决呢?很简单,只要把空指针异常都处理掉就可以了,比如做个判断处理,如下所示:


fun doStudy(study: Study?) {
    study?.doHomework()
    study?.readBooks()
}

当然还有另外一种写法:

fun doStudy(study: Study?) {
    study?.let { 
        it.readBooks()
        it.doHomework()
    }
}

字符串内嵌表达式

首先来看一下Kotlin中字符串内嵌表达式的语法规则:

"hello, ${obj.name}. nice to meet you!"

可以看到,Kotlin允许我们在字符串里嵌入${}这种语法结构的表达式,并在运行时使用表达式执行的结果替代这一部分内容。

另外,当表达式中仅有一个变量的时候,还可以将两边的大括号省略,如下所示:

"hello, $name. nice to meet you!"

这种字符串内嵌表达式的写法到底有多么方便,我们通过一个具体的例子来学习一下就知道了。在2.5.4小节中,我们用Java编写了一个Cellphone数据类,其中toString()方法里就使用了比较复杂的拼接字符串的写法。这里我将当时的拼接逻辑单独提炼了出来,代码如下:

val brand = "Samsung"
val price = 1299.99
println("Cellphone(brand=" + brand + ", price=" + price + ")")

可以看到,上述字符串中一共使用了4个加号连接符,这种写法不仅写起来非常吃力,很容易写错,而且在代码可读性方面也很糟糕。

而使用字符串内嵌表达式的写法就变得非常简单了,如下所示:

val brand = "Samsung"
val price = 1299.99
println("Cellphone(brand=$brand, price=$price)")

很明显,这种写法不管是在易读性还是易写性方面都更胜一筹,是Kotlin更加推崇的写法。这个小技巧会给我们以后的开发工作带来巨大的便利。

函数的参数默认值

我们可以在定义函数的时候给任意参数设定一个默认值,这样当调用此函数时就不会强制要求调用方为此参数传值,在没有传值的情况下会自动使用参数的默认值。

给参数设定默认值的方式也很简单,观察如下代码:

fun printParams(num: Int, str: String = "hello") {
    println("num is $num , str is $str")
}

可以看到,这里我们给printParams()函数的第二个参数设定了一个默认值,这样当调用printParams()函数时,可以选择给第二个参数传值,也可以选择不传,在不传的情况下就会自动使用默认值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1184813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SecureCRT安装、注册教程

SecureCRT保姆级安装教程!!! 安装包与注册机自取。 链接:https://pan.baidu.com/s/1IrFkHlrtCoc67QnQ_z1TWQ?pwdt25m 提取码:t25m 一 前期准备 1.1 关闭病毒查杀(如果有其他杀毒软件也要关闭&#xff0…

小明和完美序列(HashMap、Map、Entry)

小明和完美序列 知识点: //导包:HashMap、Map、Entry import java.util.HashMap; import java.util.Map; import java.util.Map.Entry;public class Main {public static void main(String [] args) { //创建Map(HashMap)对象 M…

基于Kinect 动捕XR直播解决方案 - 硬件篇

Kinect-V2 硬件设备 一、Kinect介绍 1、Kinect for Windows 的开发配置 Kinect V2 操作系统:Windows 10(必须) Windows Surface Windows Surface 2 开发环境:Visual Studio 2017 .NET Framework 4.5 (.NET Framework 4.5) 硬…

【Ubuntu 语音控制安卓设备刷短视频 orangePi zero2 H616 (已开源) 】.md uptada:23/11/07

文章目录 H616_实现Ubuntu语音控制安卓设备刷短视频小美效果展示H616 ubuntu系统 安装adb智能公元 SU-03T 离线语音模组 固件制作配合串口实现 小美_控制安卓刷抖音 H616_实现Ubuntu语音控制安卓设备刷短视频 注意:orangePi zero2 H616 安装系统为ubuntu 小美效果…

信创加速,美创科技加入UOS主动安全防护计划(UAPP)

近日,统信UOS主动安全防护计划 (UAPP) 技术沙龙暨新老会员交流活动在北京召开。 美创科技作为信创产业的重要参与者受邀参加。在2023年度UAPP合作伙伴授牌发布仪式上,美创科技获得统信软件授牌,正式成为UAPP成员单位,将与统信软件…

日防夜防,家贼难防?企业防泄密为什么这么难?

企业经营保密就是保生命,你知道吗? 案例分析 根据国家信息部门的报告显示,高达85%的数据泄密不是因为黑客工资有多厉害,而是由公司员工造成的。 而且现在移动办公环境,大家都用手机在线办公软件的工作激励外泄更容易…

使用python快速搭建接口自动化测试脚本实战总结

导读 本文将介绍如何使用python快速进行http/https接口自动化测试脚本搭建,实现自动请求、获取结果、数据对比分析,导出结果到Excel等功能,包括python的requests、pandas、openpyxl等库的基本使用方法。 测试需求介绍 通常,在我…

把枯燥的PDF文档转换为翻页电子书,一键上传搞定

PDF是我们工作生活中比较常用的文档格式之一,由于PDF文件可以离线观看,所以通常都是静态的,有时候密密麻麻的文字看得很是头晕眼花,这使得阅读体验变得单调乏味。 为了解决这个问题 , 我们推荐使用FLBOOK &#xff0c…

C盘清理指南(四)——垃圾清理工具

往期目录集合: C盘清理指南(一) 内存小的本质原因https://blog.csdn.net/jsl123x/article/details/134273657?spm1001.2014.3001.5501C盘清理指南(二)——盘符划分操作https://blog.csdn.net/jsl123x/article/detail…

客服系统本地部署:实现高效客户服务

在当今的数字化时代,客户服务已成为企业成功的关键因素之一。为了提供优质、高效的服务,许多企业选择将客服系统本地部署。这种部署方式具有许多优势,如提高响应速度、保障数据安全、提升客户满意度等。 一、客服系统本地部署的概念 客服系统…

windows的mysql启动错误,查看windows日志

1、点击左下角开始按钮,计算机上右键,点击【管理】。 2、在计算机管理界面依次找到【系统工具】,选择【时间查看器】,打开【windows日志】,点击【应用程序】 3、在右侧找到,最新的mysql错误信息。双击查看。…

移动端性能专项测试之内存 - 进阶篇

在 Android 系统中内存作为重要的资源,一直是开发及测试关注的重点,内存不足或者内存资源滥用都会导致严重的问题。本篇文章将会从底层出发给大家介绍 OOM(Out Of Memory)和 LMK(Low Memory Killer)等内存相…

python趣味编程-使用 Tkinter 进行 RPS 游戏

使用 Tkinter 的 RPS 游戏是用Python编程语言编码的应用程序。该项目使用 tkinter 库来显示游戏应用程序的 GUI。游戏机制包括选择一个符号来击败对手。在 Python 中使用 Tkinter 的 RPS 游戏是一种基于随机机会的游戏,您通过简单的运气获胜。这个使用 Tkinter 的 RPS 游戏可以…

基于SSM的化妆品购物商城/美妆销售系统

基于基于SSMVue的化妆品购物商城/美妆销售系统~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 商品详情 购物车 个人中心 登录界面 管理员界面 摘要 基于SSM的化…

全球30米SRTM高程DEM数据详解

如果你在工作或学习中需要用到30米高程DEM数据,我们可以免费为你提供一个省的高程DEM数据。 你只需要通过关注“水经注GIS”,并在后台回复“免费数据”进群后即可获取下载地址。 这里,我们为大家分享一下全球30米SRTM高程DEM数据的相关参数…

【C#学习笔记】事件

前言 在之前我学习委托的时候,写到了 学习了委托,事件其实也就学习了,事件和委托基本上一模一样: 然而在实际工作中通过对事件的深入学习后发现,实际上事件的使用比委托要严格一些,本节将详细讲解事件的使…

Android 深色模式切换适配

在Android11上测试 1&#xff0c;把需要适配的资源文件复制一份后缀加上-night&#xff0c;里面就放置变主题后的资源 2&#xff0c;两个主题一个白&#xff0c;一个黑&#xff0c;分别放置在对应的valuse-styles.xml中 <style name"Theme.LaserMachPor" parent&…

MATLAB / Simulink HDL 快速入门

MATLAB / Simulink HDL 快速入门 我们将使用实例讲解MATLAB / Simulink HDL 使用入门。 开始这个项目&#xff0c;首先需要创建一个包含 Stateflow 的新 Simulink 。只需单击画布中的任意位置并开始输入 Stateflow。 此时应该能在画布上看到 Stateflow 图标。双击图标进行编辑。…

埃安AION V Plus 80星辰版:纯电家庭SUV市场的新续航里程碑

埃安汽车全新AION V Plus 80星辰版上市&#xff1a;定位600km续航家庭SUV&#xff0c;亲民价引领市场新趋势 埃安汽车宣布其全新车型——AION V Plus 80星辰版正式上市&#xff0c;以18.59万元的竞争性价格和超过600公里的续航力&#xff0c;响应了中国家庭对于多功能、…

微软Azure OpenAI申请和使用教程

新版已增加微软Azure OpenAI接口,申请教程对照如下 一、申请使用Azure OpenAI服务 二、配置Azure OpenAI 打开这个页面:https://portal.azure.com/?quickstart=true#create/Microsoft.CognitiveServicesOpenAI 进入 Azure 后,直接搜索OpenAI 若是已经通过,这里即可选择订阅…