两句话:
1、语法上,要求不能null的,如果编译时能发现违反了不能null的约定。则编译不通过。
总有变量,编译时,是不能够知道是不是为空。这个时候还是要进行空判断。
2、对于这个空判断。kotlin的语法糖提供了简易的判断方法;(来实现所谓的空安全)
a、!!如果是空就nullpointexception(懒惰,没有默认值)
b、?如果是null,返回默认值,而不是exception。(就空安全了())😅
c、varString?.length()?:-1 类似上面的情况,不过将返回的null修改为一个默认值。
友情连接:友情连接
这篇文章说的比较合理:尽可能避免NPE,没有办法消除
空安全符号:
非null 申明:String
可null 声明: String?
可 null 调用:varName?.length() null 时返回null
可null 调用:如果varName?.length()?:-1 与上面一个不同的是,返回一个默认值而不是null
保证不null:调用:varName!!.length() 如果保证失败,就NPE
类型安全转换:
避免ClassCastException,
val aInt: Int? = a as? Int 如果失败,返回null而不是 ClassCastException
总结来说:
Kotlin要求:对于一个变量,要么你很自信,保证不为null;要么要把null的不确定性申明出来。二者必取其一。
对于一个变量,你要以保证不空的语法描述;(String , stringVar.length)
那么如果还是出现了空:
1、 编译时不通过,尽早发现是好事;
2、运行时:不好意思,还是会NPE。
如果你不能保证不为Null 那么要把这个不确定性,以语法的形式显示说明。
kotlin知道后会尽可能的帮你保证null安全。
如果不告诉kotlin这种不确定性,不好意思。Kotlin帮不了你。
转向上面👆那种情况。kotlin会以为你很自信,不为null。
1、 申明:String? 调用 varString?. 如果null那么返回null而不是NPE
2、 以上情况的增强版:如果null,那么返回一个默认值,而不是null
3、最后,一个nullAble的变量,你却很自信。好:那就varString!!.length()👉如果是你自信过头了。不好意思。还是NPE
技巧:
我们的首要、主要精力应该花费在变量声明时:决定是否绝不null,或者无法确定是否null
如果你申明为,无法确定是否null,那么剩下的交由kotlin,它会尽力帮助你。
只要你不是过分自信,结果自信过头(申明了一个会null的变量为String ;一个可null的变量varString!!.length())
NPE就不会那么容易出现了。
网友评论