首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin安全 ① ( Kotlin 安全机制 | 变量可空性 | 默认变量不可 | 声明可类型变量 )

文章目录 一、Kotlin 安全机制 二、变量可空性 1、默认变量不可 2、声明可类型变量 一、Kotlin 安全机制 ---- Java 指针问题 : 在 Java 语言...编写程序 , 出现最多崩溃就是 NullPointerException 指针异常 , 该异常是 运行时 才爆出 , 在 代码编写时 以及 编译期 很难提前排查出来 ; Kotlin 安全机制...Kotlin 程序 代码健壮性 ; 二、变量可空性 ---- 1、默认变量不可 在 Java , 引用类型变量 默认为 null ; 但是在 Kotlin , 变量默认不可为...null , 这样所有的 变量 在默认状态下 , 都有一个 默认实例对象 , 从而极大 减少了 指针异常 出现概率 ; 代码示例 : 先定义一个 name 变量 , 为其赋值字符串 "Tom...赋值一个 , 除非 将该变量声明为类型 ; 2、声明可类型变量 声明可类型变量 : 如果要声明一个 可类型变量 , 必须 声明该变量具体类型 , 并在该类型后添加 ?

1.9K20

Kotlin安全总结 ( 变量可空性 | 手动安全管理 | 安全调用操作符 | 非断言操作符 | 合并操作符 | 指针异常处理 | 先决条件函数判 )

文章目录 一、Kotlin 安全机制 二、变量可空性 1、默认变量不可 2、声明可类型变量 三、手动安全管理 四、安全调用操作符 ?...编译期 , 就可以 提前排查出可能出现指针异常问题 , 并提前进行处理 , 这样极大地提高了 Kotlin 程序 代码健壮性 ; 二、变量可空性 ---- 1、默认变量不可 在 Java... , 引用类型变量 默认为 null ; 但是在 Kotlin , 变量默认不可为 null , 这样所有的 变量 在默认状态下 , 都有一个 默认实例对象 , 从而极大 减少了...String 这是因为 var name 变量 默认为非 , 在 Kotlin 不允许将 默认变量 赋值一个 , 除非 将该变量声明为类型 ; 2、声明可类型变量 声明可类型变量...: "name 变量为" 返回是 "name 变量为" , 打印出来就是 name 变量为 内容 ; 之后 为 name 变量赋值 "Tom" 字符串 , 现在 name 变量不为 ,

1.7K10
您找到你想要的搜索结果了吗?
是的
没有找到

Kotlin入门(8)判断与处理

然而,饶是有经验开发者,尚且摆脱不了如影随形指针,何况编程新手呢?问题症结在于,Java编译器不会检查,只能由开发者在代码增加“if (*** !...Kotlin研发人员当然不会放过这点,就像读者在上一篇文章中看到那样,Kotlin通过isNullOrBlank函数进行校验,下面列出Kotlin校验字符串几个方法: isNullOrEmpty...注意到上面的方法有区分非空串与可空串,这是缘于Kotlin引入了安全概念,每个类型对象都分作不可为null和可以为null两种。...前面的文章,正常声明对象默认都是非不可为null),比如下面这个声明字符串变量代码 var strNotNull:String = "" 非对象要么在声明时就赋值,要么在方法调用前赋值...表示对象为时就直接返回null,所以返回变量必须被声明为类型 length_null = strB?.

4.2K10

Better Kotlin

这意味着你不允许明确声明为 val,它就不能保证它是不可。 对于普通变量来说,「不可变」和「只读」之间并没什么区别,因为你没办法复写一个 val 变量,所以在此时却是是不可。...我们可以通过以下解决方法来减少生成字节码: 对于基本类型和字符串,可以使用 const 关键字将常量声明为编译时常量。 对于公共字段,可以使用 @JvmField 注解。...LazyThreadSafetyMode.PUBLICATION:多个线程会同时执行,初始化属性函数会被多次调用,但是只有第一个返回被当做委托属性。...7 注意 Kotlin 不可 最近闹了一个笑话,在项目中需要写一个上传跳绳数据功能。于是有了下面的代码。...仔细一看,发现 Java 编写这个接口时候,会被认为这个参数 "data" 对应 "value" 是可以为 null ,而改为 Kotlin 后,由于 Kotlin 默认不为机制,所以需要参数是一个不可以为

1.2K20

kotlin基本语法

java各种痛点而产生,利用kotlin可以大大减少开发过程代码量编写,有一套几乎可以杜绝指针机制,kotlin没有分号 二、如何运行Kotlin代码 郭霖大神这本第三行代码是在...fun main (){ prinln("hello world") } 三、编程之本:变量和函数 变量 val a //a声明为不可 var b//b声明为可变 为了保证程序变量稳定...函数体} 最后一行代码作为函数返回 Java函数式API使用 与后面android sdk 接入有关,不过目前还没怎么看懂,用到了再说 七、指针检查 可类型系统 kotlin...默认所有变量都不可 类型?...//强制判断非 let//就不太明白 八、kotlin小魔术 字符串内嵌表达式 利用$进行内嵌,解决java字符串拼接时一堆加号和分号痛点 val a = "22" val b = "67

57230

Kotlin学习之路(2)数据类型

这样Kotlin将该变量或表达式嵌入到该字符串 var Price : Double= 88.0 var s = "图书价格是:${Price}元" 【数组–暂时先了解】 暂时先了解一下,在【集合...,我们只要把这个int 换成long float double 即可,但是在Kotlin这么玩是不可Kotlin数组声明 var int_array:IntArray = intArrayof...在Kotlin也可以通过下标的方式获取对应元素,不过Kotlin要比Java多出两个方法 get set,通过get获取元素,通过set方法修改元素,感觉就像在操作ArrayList队列一样...就是一个可类型,这种类型可以接受Int和null;而Int类型只能接收Int不能接受null。...☆ 只有可变量或常量才能接受null,非类型变量或常量不能接受null var aStr: String = "kit" var bStr: String?

75120

类型声明与安全(Void Safety)

Kotlin 不可能为变量和可能为变量被强行分开了(Java 有 @Nullable 和 @NonNull 注释,但只会提供警告)。那 Kotlin 为什么要这样设计呢?...Kotlin类型/可类型(NonNull/Nullable)声明 最开始时我们提到:在 Kotlin 不可能为变量和可能为变量被强行分开了。具体是怎么分开呢?...Kotlin(Nullable)传递性 如果一个可对象调用了方法,因为这个方法有可能不被执行,那么如果我们接收它返回,那么返回类型应该是什么呢?...所以,可是具有传递性。 双叹号由于在变量为时会抛出异常,所以它返回就还是为 Int,因为抛了异常的话,后面的代码已经不会被执行了。...回到场景 如果用 Kotlin 来实现场景代码,只需要将 mAudioPlayer 声明为类型就可以了: PlayerController.kt: /** * 用户音频 ugc 播放器。

98650

Kotlin----控制语句

1、条件分支 (1)、简单分支–if…else kotlin if…else 语句具有返回,类似于Java三目运算 //传入两个 a 和 b , 将大显示在TextView控件 nameTextView.text...kotlin默认变量非,如果需要声明一个可变量,则在类型后面追加一个问号?...(3)、校验运算符——?、?:、!! ​ ? 表示可,如果直接返回null ​ ?: 表示一旦为返回冒号后面的,否则返回正常 ​ !! 表示断言非(放弃非判断)。...断言时得到属性长度为$length" } 4、等式判断 (1)、结构相等 kotlin中使用 == 判断两个数据是否相等,使用 != 判断是否不相等。...Java中使用equals() kotlin中比较字符串时不再比较在内存存储地址,而是直接比较变量值 ,这种方式就被叫做 结构相等,即模样相同/外观相同。

60320

干货|Kotlin入门第一课:从对比Java开始

第1行,编译错误,kotlin规定如果显式指明了str1类型,这里是String,声明时必须同时指定是否允许为(null),不加问号”?”...解释完变量定义时关于概念,接下来就该看看这种保护机制能否真的让我们省心。就拿获取字串长度为例,KotlinString类有个length属性,即调用方式为strObject.length。...所以,String类型但允许为null才需要我们关注,因为这时候有可能出现运行时异常。 对于声明为String?变量,访问属性时会涉及到问号和双感叹号两个操作符(”?”和”!!”)...length: " + str2.length) //print 8 14 } 第2行,编译错误,因为之前只是将str2明为可以是null同时赋值为null,所以紧接着访问其length属性是不允许...属性; 第5-7行,不会执行到if代码块,这里用了类似Java做法; 第9行,输出”8″,到这里,相比能体会到Kotlin智能之处了,在第八行对str2赋值之后,就不会再像第二行那样报编译错误了

978110

浅谈Kotlin(六):lateinit、by lazy 使用

Kotlin中有两种延迟初始化方式。一种是lateinit var,一种是by lazy。...一、lateinit使用 按Java写法,此时即代表datas默认为null,但是因为Kotlin机制,这里给出了两种选择,要不给一个初始,要不增加lateInit修饰 则可以这么写:...*/ 也可以这么写: 表示我先不给一个初始,编译期时候也无需进行非判断,后面我会找时机给他赋值 即late作用为编译期在检查时不要因为属性变量未被初始化而报错 lateinit var datas...property datas has not been initialized lateinit使用限制: 只能用来修饰类属性,不能用来修饰局部变量, 只能用来修饰对象,不能用来修饰基本类型(因为基本类型属性在类加载后准备阶段都会被初始化为默认...时再进行初始化 打印结果: lazyParm初始化 lazyParm->aaa by lazy使用限制: 要求属性明为val,即不可变变量,在java相当于被final修饰。

2.7K32

Kotlin安全 ② ( 手动安全管理 | 安全调用操作符 ? | let 函数结合安全调用操作符使用 )

三、let 函数结合安全调用操作符使用 一、手动安全管理 Kotlin 语言中 , 变量类型 分为 可类型 和 非类型 , 默认状态 下 , 变量是 非类型 , 如果使用 类型?...将变量声明为类型 , 那么就需要使用 手动安全管理 ; 代码示例 : 在下面的代码 , 将 name 变量声明为了 String?...二、安全调用操作符 ? 在 Kotlin 语言中 , 调用 可类型变量 成员 时 , 可以使用 " 安全调用操作符 " 也就是 ? 进行调用 , 使用格式如下 : 可类型变量?....成员 使用了 安全调用操作符 之后 , 在调用变量成员前 , 会自动进行 检查 , 如果该变量为 , 则会 跳过后面的 成员调用 , 继续执行下一行代码 ; 代码示例 : 在下面的代码 , 调用.../ 闭包 含义是 , 如果 name 变量 字符串非空白, 将其转为首字母大写 , 并返回 , 如果 name 变量 字符串为空白, 设置 Hello 为返回 ; fun main() {

58120

Android平台Swift—Kotlin

kotlin可变集合对Java集合进行了包装,同时它实现了一套不可变集合库。 [12.png] 访问: [13.png] 6、伴生对象 Kotlin没有静态属性和方法。...[16.png] ----- 二、新特性 1、安全 Kotlin是如何实现安全呢? 在Kotlin,对象声明分为可引用和非引用两种。...这就在编译期间杜绝了指针异常。但是这里要注意一点,如果从Java返回集合,不会强制做可检查,这个是时候如果给不可引用赋值Java集合null会出现转换错误异常。...3、字符串模板 表示字符串可以包含变量或者表达式,以$符号开头(这跟JSPEL表达式有点像),比如: [22.png] Kotlin是通过单引号进行转义 [23.png] 4、操作符重载 Kotlin...2)Kotlin反射: [36.png] 可以不通过KClass对象,直接调用方法和访问属性(注意:如果有重载函数或同名属性不能使用以下方式)。 [37.png] 4、协程 什么是协程?

3.4K90

4. 变量声明和变量状态设计

上一篇文章讲的是安全特性,它允许你方便处理对象可能为情况。但他价值更大另一面在于,Kotlin 可以声明不可能为对象。 1. 非类型 对象不可能为意味着程序复杂度降低。...在 Java 环境里,我们出于对调用 SDK 不信任,总是要去判断以下是否为,以保平安,这样处理代价就是,增加了大量异常分支代码。如果一个变量他永远都不可能为,那其实是一件很快乐事!...2. lateinit 说到尽量声明为类型,有人就会提出质疑了:非类型说来简单,但部分依赖外部调用完成初始化变量,无法声明为类型啊?...这看起来像是一个把 Kotlin 安全废掉,退化为原来 Java 检查行为。...对象就是拥有这个类默认实现对象。对于数据类来说,它对象可能所有成员变量都是0,false,长度为0字符串;对于带方法类来说,它对象可能是所有方法都是,可以调用但没有任何效果。

1.6K30

Kotlin简单问

kotlin为什么被设计出来 kotlin被设计出来并被Google推广,主要有以下优势: 完全兼容Java 更少指针异常 更少代码量,更快开发速度(lambda表达式,扩展函数) kotlin...kotlin安全 java,我们可以任意初始化一个变量,而不需要赋值,比如String,就有它默认null。 String a; 如果要调用对象参数,必须判: if (a!...length val和var val,全称value,声明一个不可变量,这种变量在初始赋值之后就再也不能重新赋值了,所以相当于javafinal变量。...kotlin这么设计原因主要是把不可变变量 这种因素和可变变量拿到同一级来设计,也就是说我们以后编码设计变量时候,必须要考虑这个变量是不可变还是可变,保护变量安全,养成良好习惯,而不像以前要在java...kotlin,对于$符号表示 串模板,就是可计算代码片段,可以将其计算结果链接到字符串

85030

小谈 Kotlin 空处理

接受 null,而 var time: Long 则不能接受 null。 在变量传递阶段,必须保持“可空性”一致,比如形参声明是不为,那么实参必须本身是非或者转为非才能正常传递。...,后端没传该就会抛出指针异常。 2. 过分依赖 Kotlin 检查 private lateinit var mUser: User ......Android Studio 检查,在代码提示 Intent getParcelableExtra 方法返回是非,因此这里你直接用方法结果赋值不会有任何警告。...变量或形参声明为 这点与第一、第二点都很类似,主要是使用过程中一定要进一步思考传递过来是否真的非。...有人可能会说,那我全部都声明为类型不就得了么 —— 这样做会让你在使用该变量所有地方都需要判Kotlin 本身便利性就荡然无存了。

85310

你应该切换到Kotlin开发

现在是开始使用新编程语言时候了。自从Kotlin成为谷歌官方语言后,你有没有心动? ? 我想告诉你一个名为Kotlin新编程语言并且阐述为什么你应该考虑下一个项目中使用它。...但是我将会聚焦到最初环境(JVM) 所以以下会给出几个你为什么需要切换到Kotlin语言开发原因(没有先后顺序) 一、与Java互通性 Kotlin能够达到和JAVA100%互通,也就是说你可以使用...") 十六、安全 Java是一种应该称之为几乎静态类型语言,在Java,String类型变量不能保证引用String(安全) - 它可能引用为null,即使我们已经习惯了这个类型,它抵消了静态类型检查安全性...(NullPointerException)或者想法设法避免(有点多于工作) Kotlin则是通过区分非类型和类型来解决这个问题。默认情况下,类型为非,并且可以默认添加一个?...1、如果lambda表达式是方法最后一个参数或唯一参数,则可以移动或省略方法括号 2、如果我们选择不声明一个single-argument-lambda,它将被隐式声明为it 由以上两点可以得到以下三行代码形式

44500

是时候使用Kotlin编程了

kotlin可变集合对Java集合进行了包装,同时它实现了一套不可变集合库。...伴生对象调用跟Java一样,通过类名.属性名称或函数名称调用。 新特性 1,安全 在Kotlin,对象声明分为可引用和非引用两种。...但是这里要注意一点,如果从Java返回集合,不会强制做可检查,这个是时候如果给不可引用赋值Java集合null会出现转换错误异常。...3,字符串模板 字符串可以包含变量或者表达式,以$符号开头(这跟JSPEL表达式有点像),比如: 4,操作符重载 Kotlin为基本运算符提供了固定名称函数表,此部分比较多,关于这方面的内容...4.9 Kotlin动态类型 4.10 Kotlin安全 4.9.1 可类型与不可类型 4.9.2 判操作符 4.9.3 Elvis 操作符 4.9.4 强校验操作符 4.9.5 安全类型转换

3.2K10

干货 | Kotlin超棒语言特性

这些语言特性包括安全、Elvis表达式、简洁字符串等等。 01更加安全指针操作 在Kotlin,一切皆是对象。不存在int, double等关键字,只存在Int, Double等类。...为了获得更好安全,Kotlin中所有的对象都明确指明可或者非属性,即这个对象是否可能为null。 ? 对于可类型对象,直接调用其方法,在编译阶段就会报错。...比如我们要把一个对象转换成字符串,在Kotlin可以直接这么写: ? 上述代码先定义了一个指针对象,然后调用toString方法,会不会Crash?...考虑下面四种场景: 在变量定义,代表变量类型 在类定义,代表基类类型 在函数定义,代表函数返回类型 在匿名对象,代表对象类型 笼统来说,Kotlin设计者应该就是想用冒号来笼统表示类型这一概念...上述代码,name是一个属性,改变它都会自动回调{ kProperty, oldName, newName -> }这个lambda表达式。简单来说,我们可以监听name这个属性变化。

1.4K40
领券