首页 > 其他分享 >Kotlin的空安全

Kotlin的空安全

时间:2023-06-01 12:23:54浏览次数:36  
标签:String Kotlin 安全 可空 类型 null name

Kotlin中的可空类型

在Kotlin中可以通过在类型后加一个?来表示该类型是可空类型,例如:

var name : String?
var id: String

上述代码表示name是一个可空的String类型变量,而id是一个不可为空的String类型变量。
如果在代码中试图将一个可空的值赋值给id,则会导致如下的编译错误:

Type Mismatch.
Required: String
Found: String?

访问可空类型的变量

在Kotlin中可以通过?.操作符安全地访问可空类型的变量,例如:

class Test {

    fun test(name: String?) {
        println(name?.length)	//如果name是null,这里不会crash,而是输出null
    }

}

还可以使用?:运算符来额外处理当可空类型的值为空时的情况,例如:

class Test {

    fun test(name: String?) {
        println(name?.length ?: 0) //如果name是null,则输出0
    }

}

如果我们确定访问一个可空类型的变量时这个变量的值一定是非空,那么可以使用!!来将可空类型变量当做非空类型变量来访问,例如:

class Test {
    var name: String? = null

    fun test() {
        name = "william"
        println(name!!.length)	//如果这里name实际是空,则会抛出NPE
    }
}

另外,对于类型转换我们还可以使用as?运算符来安全地进行类型强转,例如:

class Test {
    fun test(name: String?) {
        var num = name as? Int  //如果使用as则会抛出ClassCastException
        var str = name as String //这里可能会抛出ClassCastException
    }
}

上述代码中name强转成Int类型会失败,但是不会抛出ClassCastException,而是返回null。试图将一个可空类型变量强转成非空类型变量是危险的,上述代码中如果name的值是null,那么强转成String类型就会引发ClassCastException

Kotlin空安全的实现原理

Kotlin主要通过编译时检查以及运行时检查的机制来实现空安全,以如下Kotlin代码为例。

class Test {

    fun test(name: String?) {
        println(name?.length ?: 0) //如果name是null,则输出0
        println(name!!.length)
        println(name as? Int)
    }

}

我们将其转成字节码后再反编译可以得到如下Java代码:

public final class Test {

   public final void test(@Nullable String name) {
      int var2 = name != null ? name.length() : 0;
      System.out.println(var2);
      Intrinsics.checkNotNull(name);
      var2 = name.length();
      System.out.println(var2);
      String var10000 = name;
      if (!(name instanceof Integer)) {
         var10000 = null;
      }

      Integer var3 = (Integer)var10000;
      System.out.println(var3);
   }

}

可以看出对于可空的参数,Kotlin在编译的时候会加上@Nullable注解。
使用?.操作符访问可空类型实际就是在访问前会先判断可空类型的变量的值是否为null
?:操作符则转换成了Java中的三元运算法,判断条件是可空类型的变量的值非空。
!!操作符则是在访问可空类型变量前调用Intrinsics.checkNotNull函数断言参数非空,如果为空则抛出NPE
as?操作符则是通过Java中的instanceof来判断类型是否符合强转的目标类型,不符合则返回null

标签:String,Kotlin,安全,可空,类型,null,name
From: https://www.cnblogs.com/jqctop1/p/17445650.html

相关文章

  • windows下通过net user add和powershell添加用户,sysmon仅仅采集到进程,而在windows安全
    执行操作:C:\Windows\system32>netuser/add"jack""fuckoff"命令成功完成。C:\Windows\system32>powershellWindowsPowerShell版权所有(C)MicrosoftCorporation。保留所有权利。尝试新的跨平台PowerShellhttps://aka.ms/pscore6PSC:\Windows\system32&g......
  • 计算机安全_jlu_ccst部分笔记
    这些是我当时复习计算机安全这门课的时候写的一些笔记(没有的部分要么是比较简单,要么是我没复习到(有的计算现在我还有别的事时间比较紧张,顾不上整理这门课的内容了,直接把图片放出来有需要的同学可以参考一下 (坏了,还少了一半,我记得当时是写了三四十页的(挠......
  • 微软正在研究使 Linux 脚本更安全
    导读据悉,微软正在研究使 Linux 脚本更安全微软正在研究使Linux 脚本更安全在本周的Linux安全峰会上,systemd的创建者LennartPoettering发表了演讲,他在过去的一年中被微软雇佣,他和微软的其它工程师们正在努力提高Linux的安全性。微软的工程师发表的演讲介绍了......
  • Web安全
    Web安全工具HackBarHackBarCharsetCharsetCookieHackerCookieHackerProxySwitchySharpProxySwitchySharpWappalyzerhttps://www.wappalyzer.com/WappalyzerBurpSuiteBurpSuite是用于攻击Web应用程序的集成平台框架。它包含了许多web安全相关工具,也同时设计了接......
  • 电子政务及安全研究报告
    一、电子政务的内容和网络规范的内容(一)电子政务的内容电子政务是指国家机关在政务活动中,全面应用现代信息技术、网络技术以及办公自动化技术等进行办公、管理和为社会提供公共服务的一种全新的管理模式。广义电子政务的范畴,应包括所有国家机构在内;而狭义的电子政务主要包括直接......
  • 学习文章:即时通信的安全加密通信模型研究
    学习文章:即时通信的安全加密通信模型研究,具体见原论文摘要重点:即时通信的安全性和易用性。主要工作:分析国内外即时通信的安全通道模型、详细讨论起消息加密和发送流程、给出不同加密模式下的群聊和多设备端的消息转发原理,设计端到端加密的安全通道模型,分析各种安全通信模型的......
  • When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结
    链接:http://ucys.ugr.es/jnic2016/docs/MachineLearning_LiorRokachJNIC2016.pdf https://people.eecs.berkeley.edu/~adj/publications/paper-files/SecML-MLJ2010.pdf一些关键点:算了,不总结了。......
  • elasticsearch如何安全重启
    elasticsearch如何安全重启节点问题:elasticsearch集群,有时候可能需要修改配置,增加硬盘,扩展内存等操作,需要对节点进行维护升级。但是业务不能停,如果直接kill掉节点,可能导致数据丢失。而且集群会认为该节点挂掉了,就开始转移数据,当重启之后,它又会恢复数据,如果你当前的数据量已经很大......
  • SCA 技术进阶系列(二):代码同源检测技术在供应链安全治理中的应用
    直击痛点:为什么需要同源检测随着“数字中国”建设的不断提速,企业在数字化转型的创新实践中不断加大对开源技术的应用,引入开源组件完成应用需求开发已经成为了大多数研发工程师开发软件代码的主要手段。随之而来的一个痛点问题是:绝大多数的应用程序都包含开源组件风险。因而,能够......
  • 【windowns】记一次天玥安全网关无法连接运维机排查
    问题背景:在用天玥安全网关来连接项目中的运维机时,发现无法连接报网络连接错误(报错图如下:),但是通过同网络的区域的其它电脑是可以正常远程到目标主机。解决方案:经过排查发现,是因为之前有做加固操作,WindowsServer远程桌面SSL/TLS漏洞修复  修复过程如下:1、运行“gpedit.m......