解决kotlin.KotlinNullPointerException以及问题分析
2018-02-09 15:43
471 查看
学习Kotlin过程中难免会遇到kotlin.KotlinNullPointerException这个问题,
尼玛,kotLin不是传说中的空值安全吗?怎么会出现空指针异常。好吧,我不是来吐槽的。
这个异常的原因是定义变量或调用变量时使用了!!比如 var mainHandeler: Handler = null !!
明白了问题产生的原因下面就说说如何解决这个问题
1,用val而不是var
在 Kotlin 中 val 代表常量,var 代表变量。建议尽可能多的使用 val。val 是线程安全的,并且不需要担心 null 的问题。只需要注意 val 在某些情况下也是可变的就行了。
2,使用lateinit
有些情况我们不能使用 val,比如,在 Android 中某些属性需要在 onCreate() 方法中初始化。对于这种情况,Kotlin 提供了 lateinit 关键字。
private lateinit var disposable:Disposable要注意,访问未初始化的 lateinit 属性会导致 UninitializedPropertyAccessException。并且 lateinit 不支持基础数据类型,比如 Int。
3,使用let函数
val x: Int? = null
x?.let{ val y = x!!.toDouble() } 也就是判断x不为空时才走let{}中的代码
4,使用Elvis运算符
对于let函数,我们是判断不为空才走的,但如果为空时我们想做一些操作怎么办?用Elvis运算符
fun getUserName(): String {
return mUserName ?: "Anonymous"
}代码等同于fun getUserName(): String {
if (mUserName != null) {
return mUserName!!
} else {
return "Anonymous"
}
}参考:https://zhuanlan.zhihu.com/p/27285806?utm_source=tuicool&utm_medium=referral https://www.cnblogs.com/figozhg/p/6686798.html
尼玛,kotLin不是传说中的空值安全吗?怎么会出现空指针异常。好吧,我不是来吐槽的。
这个异常的原因是定义变量或调用变量时使用了!!比如 var mainHandeler: Handler = null !!
val x: Int? = null val y = x!!.toDouble()这个!!是用来避免null检查的,也就是你确定他不是空的,但实际上他真的空了,就出现上kotlin.KotlinNullPointerException异常。
明白了问题产生的原因下面就说说如何解决这个问题
1,用val而不是var
在 Kotlin 中 val 代表常量,var 代表变量。建议尽可能多的使用 val。val 是线程安全的,并且不需要担心 null 的问题。只需要注意 val 在某些情况下也是可变的就行了。
2,使用lateinit
有些情况我们不能使用 val,比如,在 Android 中某些属性需要在 onCreate() 方法中初始化。对于这种情况,Kotlin 提供了 lateinit 关键字。
private lateinit var disposable:Disposable要注意,访问未初始化的 lateinit 属性会导致 UninitializedPropertyAccessException。并且 lateinit 不支持基础数据类型,比如 Int。
3,使用let函数
val x: Int? = null
x?.let{ val y = x!!.toDouble() } 也就是判断x不为空时才走let{}中的代码
4,使用Elvis运算符
对于let函数,我们是判断不为空才走的,但如果为空时我们想做一些操作怎么办?用Elvis运算符
fun getUserName(): String {
return mUserName ?: "Anonymous"
}代码等同于fun getUserName(): String {
if (mUserName != null) {
return mUserName!!
} else {
return "Anonymous"
}
}参考:https://zhuanlan.zhihu.com/p/27285806?utm_source=tuicool&utm_medium=referral https://www.cnblogs.com/figozhg/p/6686798.html
相关文章推荐
- Java语言学习--Java引用以及NullPointerException问题的解决
- 艰辛的aptana插件安装之路(续)--成功解决myeclipse不能启动和报java.lang.NullPointerException的问题
- android开发中遇到的问题解决之RelativeLayout执行measure(w,h)方法时,出现NullPointerException的异常情况
- 重新打开Eclipse出现java.lang.NullPointerException的问题解决
- Spinner的NullPointerException问题-->未解决(初步怀疑是Spinner本身的问题)
- 解决Context.getExternalFilesDir(null)返回null造成java.lang.NullPointerException的问题
- 解决安装Aptana插件后启动MyEclipse6.5后报错java.lang.NullPointerException的问题
- Android中利用NetworkInfo判断网络状态时出现空指针(NullPointerException)问题的解决方法
- 解决MapReduce任务在windows本地执行的NullPointerException问题
- equals中NullPointerException问题解决
- java.lang.NullPointerException at oracle.jdbc.dbaccess.DBData.clearItem(DBData.java:431)问题解决
- 访问jsp报错org.apache.jasper.JasperException: java.lang.NullPointerException的解决办法 问题描述:
- Exception starting filter struts2 java.lang.NullPointerException 问题解决
- spark 从HIVE读数据导入hbase中发生空指针(java.lang.NullPointerException)问题的解决
- 解决tomcat6部署spring4+mybatisJSP页面产生的500错误,控制台报java.lang.NullPointerException的问题
- Exception starting filter struts2 java.lang.NullPointerException 问题解决
- cocos2d-x3.2中在Eclipse中java.lang.NullPointerException的问题解决
- 解决JavaScript validator throws NullPointerException in Eclipse问题
- 解决 RMContainerAllocator: Exception while unregistering java.lang.NullPointerException问题
- 艰辛的aptana插件安装之路(续)--成功解决myeclipse不能启动和报java.lang.NullPointerException的问题