Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 即使在kotlin中检查为not null之后,也需要非null断言_Android_Kotlin - Fatal编程技术网

Android 即使在kotlin中检查为not null之后,也需要非null断言

Android 即使在kotlin中检查为not null之后,也需要非null断言,android,kotlin,Android,Kotlin,我在android studio的Kotlin中有以下代码: result.put(REGISTER_DATE, if (activityData.registerDate == null) -1 else activityData.registerDate.totalDays) 如您所见,我检查registerDate是否不为null,但我必须在activityData.registerDate之后放置非null断言以消除null错误: result.put(REGISTER_DATE, i

我在android studio的Kotlin中有以下代码:

result.put(REGISTER_DATE, if (activityData.registerDate == null) -1 else activityData.registerDate.totalDays)
如您所见,我检查registerDate是否不为null,但我必须在activityData.registerDate之后放置非null断言以消除null错误:

result.put(REGISTER_DATE, if (activityData.registerDate == null) -1 else activityData.registerDate!!.totalDays)
这是Kotlin中的一个bug还是与Android Studio有关?

这不是bug,在这种情况下不起作用。您可以使用将代码修复为更好的解决方案:

result.put(REGISTER_DATE, activityData.registerDate?.totalDays ?: -1)
表达式activityData.registerDate?.totalDays的计算值为totalDays,如果在安全运算符链中访问的任何值也为null,则计算值为null。如果表达式的计算结果为null,Elvis运算符将负责提供默认值-1。

这不是错误,在这种情况下不起作用。您可以使用将代码修复为更好的解决方案:

result.put(REGISTER_DATE, activityData.registerDate?.totalDays ?: -1)
表达式activityData.registerDate?.totalDays的计算值为totalDays,如果在安全运算符链中访问的任何值也为null,则计算值为null。如果表达式的计算结果为null,Elvis运算符将负责提供默认值-1

这是Kotlin的bug还是与Android Studio有关

两者都不是。activity.registerDate是对象的一个可变的可为null的属性,因此理论上它可以在任何时候被另一个线程更改。Kotlin编译器没有足够的知识来证明当您第二次加载该属性时,该属性的值不会改变这一无可争议的事实

避免这种情况的典型方法是只加载属性一次,将其捕获到局部变量中。在您正在展示的特定案例中,您只需要Elvis操作员:

activityData.registerDate?.totalDays ?: -1
这是Kotlin的bug还是与Android Studio有关

两者都不是。activity.registerDate是对象的一个可变的可为null的属性,因此理论上它可以在任何时候被另一个线程更改。Kotlin编译器没有足够的知识来证明当您第二次加载该属性时,该属性的值不会改变这一无可争议的事实

避免这种情况的典型方法是只加载属性一次,将其捕获到局部变量中。在您正在展示的特定案例中,您只需要Elvis操作员:

activityData.registerDate?.totalDays ?: -1

可能您正在检查可变属性变量,并且由于可能存在的并发问题,Kotlin编译器不会对非空值执行智能转换

顺便说一句,Kotlin还有另一种检查方法:

 result.put(REGISTER_DATE, activityData.registerDate?.totalDays ?: -1)

可能您正在检查可变属性变量,并且由于可能存在的并发问题,Kotlin编译器不会对非空值执行智能转换

顺便说一句,Kotlin还有另一种检查方法:

 result.put(REGISTER_DATE, activityData.registerDate?.totalDays ?: -1)

您不应该在函数调用中嵌套if-else语句。使用elvis运算符或将条件提取到变量,为了可读性,您不应该在函数调用中嵌套if-else语句。为了可读性,请使用elvis运算符或将条件提取到变量