Android 即使在kotlin中检查为not null之后,也需要非null断言
我在android studio的Kotlin中有以下代码: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
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运算符或将条件提取到变量