直接上实例:

fun main(args: Array<String>) {
println("now, begin save data to database")
val dataBaseOperator: DataBaseOperator? = null
dataBaseOperator?.saveDataToDataBase("important things")
println("""return "ok" to other services""")
} class DataBaseOperator { fun saveDataToDataBase(data: String) {
println("save data $data to database")
}
}

代码运行得完全没有问题,输出结果:

now, begin save data to database
return "ok" to other services

But,很明显,我们的数据并没有保存到数据库中,但返回给了其他服务OK的结果,这个是要出大问题的。

fun main(args: Array<String>) {
println("now, begin save data to database")
val dataBaseOperator: DataBaseOperator? = null
// 错误做法
//dataBaseOperator?.saveDataToDataBase("important things")
// 正确做法
dataBaseOperator!!.saveDataToDataBase("important things")
println("""return "ok" to other services""")
}

正确的做法是直接抛出异常。因为数据库没有保存到数据库中,原因是null异常

所以,一定不要为了保证代码运行得没有问题,而滥用 ? 。这样的做法是错误的。

工程实例:

@Controller
class OrderController { val logger = LoggerFactory.getLogger(this.javaClass) @Autowired
var orderService: PayOrderService? = null @PostMapping("payAliPay")
@ResponseBody
fun payAliPay(@RequestParam(value = "user_id", required = true) user_id: Long) {
// 保存数据到数据库中
orderService?.saveDataToDataBase(user_id)
println("""return "ok" to other services""")
} }

因为在Spring Boot中,有需要是自动导入的实例,如果这时候,我们使用?来规避抛出null异常,代码运行的是没有问题的。但是,数据呢?并没有保存到数据库中。

再次强调,千万不要滥用Kotlin ?的空检查。

请不要乱用Kotlin ? 空检查的更多相关文章

  1. APP微信支付报错《商户号该产品权限未开通,请前往商户平台>产品中心检查后重试》

    问题 最近项目使用MUI,HBuilder.开发打包H5的app 在开发H5 plus支付的时候,遇到以下问题: App微信支付调官方的统一下单接口返回错误信息 {return_msg=商户号该产品权 ...

  2. C# 9.0 新特性之参数非空检查简化

    阅读本文大概需要 1.5 分钟. 参数非空检查是缩写类库很常见的操作,在一个方法中要求参数不能为空,否则抛出相应的异常.比如: public static string HashPassword(st ...

  3. kotlin - 空安全

    空安全设计的操作符号 操作符 作用 ? 可空操作符,声明该值可为空 ?. 安全调用操作符       b?.length 如果b非空,就返回b.length,否则返回 null !! 非空断言运算符, ...

  4. 《Sqlserver》通过端口 8080 连接到主机 localhost 的 TCP/IP 连接失败。错误:“驱动程序收到意外的登录前响应。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受

    1. 点击 开始 --> 所有程序 --> Microsoft SQL Server2005 --> 配置工具-->SQL Server configuration Manag ...

  5. github host你懂得,如果你是程序员请不要乱传,求求了

    可用截止测试时间 2015-01-12 github相关的hosts 207.97.227.239 github.com 65.74.177.129 www.github.com 207.97.227 ...

  6. Kotlin 检查空类型

    Kotlin 会检查你定义的非空类型 如果运行过程中被赋空值了  会直接crash

  7. Kotlin——从无到有系列教程(5): 你该知道的Kotlin可空类型、空安全(null)、类型转换等特性

    在我们熟知的Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null. ...

  8. 如何应对ISP乱插广告(案例分析)

    一.广告从何而来? 利益让人铤而走险,从而推动行业“发展”:广告的利益还真不小,xx房产门户网站上一个广告位少则几千,多则几十万:记得在校读书的时候,刚学会做网站,第一想法就是等自己的网站发展成熟有人 ...

  9. Kotlin 资料

    https://kotlinlang.org/docs/reference/  官方 https://github.com/JetBrains/kotlin/releases   Kotlin SDK ...

随机推荐

  1. RTM,RTW,GA等软件版本号详解

    一直以来,对于新手而言,软件的版本号都是个比较困扰人的问题,什么Beta.RC,再来个RTM.RTW....头大了吧?RTM和RTW有什么区别?借此机会,就给大家介绍一下这方面的小知识吧. 1.软件开 ...

  2. C++中string.find()函数,string.find_first_of函数与string::npos

    查找字符串a是否包含子串b,不是用strA.find(strB) > 0而是strA.find(strB) != string:nposstring::size_type pos = strA. ...

  3. 017 CPU冲高定位方法

    1.通过top命令查看cpu占用高的进程ID; 2.通过top -Hp 进程ID 查看该进程下所有线程占用cpu的情况,拿出占用cpu最高的线程ID,换算成十六进制; 3.通过 jstack 进程ID ...

  4. .Net Core 部署到 CentOS7 64 位系统中的步骤

    建议使用 root 管理员账户操作 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是服务器一开机就启动服务器 上发 ...

  5. scala学习笔记3

    一.条件表达式 在scala中if/else表达式有值,这个值就是跟在if或者else之后的表达式的值. scala> val x = 10 x: Int = 10 scala> val ...

  6. Native Apps、Web Apps

    Native Apps 指的是远程程序,一般依托于操作系统,有很强的交互,是一个完整的App,可拓展性强,需要用户下载安装使用 优点: 打造完美的用户体验 性能稳定 操作速度快,上手流畅 访问本地资源 ...

  7. TPC-H数据导入MySQL教程

    0. TPC-H是啥 TPC-H是TPC提供的一个benchmark,用来模拟一个现实中的商业应用,可以生成一堆虚构的数据,且自带一些查询,可以导入到各种数据库中来模拟现实需求,检查性能. 具体是怎样 ...

  8. Java学习(运算符,引用数据类型)

    一.  运   算    符 1.算数运算符 运算符是用来计算数据的符号.数据可以是常量,也可以是变量.被运算符操作的数我们称为操作数. 算术运算符最常见的操作就是将操作数参与数学计算,具体使用看下图 ...

  9. [实战]MVC5+EF6+MySql企业网盘实战(24)——视频列表

    写在前面 上篇文章实现了文档列表,所以实现视频列表就依葫芦画瓢就行了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) ...

  10. loadrunner场景中按scenario和group执行的区别

    group:多个脚本之间按照独立设置模式跑,各个脚本可以单独设置虚拟用户.运行时间等 scenario:多个脚本之间按照相同的模式跑,将总的虚拟用户数按照一定的比例分配给各个脚本