希望对Android应用中的Kotlin非空断言错误进行解释。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了希望对Android应用中的Kotlin非空断言错误进行解释。相关的知识,希望对你有一定的参考价值。

我是Kotlin的新手,我正在编写一个android应用程序,但我收到了以下截图中描述的编译器警告。

我对这个特殊错误的疑问与以下几行有关。

if (months?.toInt() == 1) { monthsText = "1 Mo " }
if (months?.toInt() > 1) { monthsText = String.format("%d Mos ", months) }

第一行的==编译正常,但> 1产生了null断言。 我已经添加了一个错误的截图和一个代码片段。 另外,如果有更好的代码方法,可能对我理解这个问题有帮助。

如果我添加了错误中提到的 !!,它就会编译和运行,但如果月份变量为空,这可能是应用程序崩溃。

我真的不明白为什么==会和&gt不同。

enter image description here

我从数据库中获取的数据中,"yearsMonthsExperience "存储为 "1205"(YYMM)。

val yearsMonths= (markerData.mMarkerUser!!["yearsMonthsExperience"] as? String)?.padStart(4, '0')
val years = yearsMonths?.take(2)?.toInt()
val months = yearsMonths?.takeLast(2)?.toInt()
var yearsText = ""
if (years != null && years == 1) { yearsText = "1 Yr " }
if (years != null && years > 1) { yearsText = String.format("%d Yrs ", years) }
var monthsText = ""
if (months?.toInt() == 1) { monthsText = "1 Mo " }
if (months?.toInt() > 1) { monthsText = String.format("%d Mos ", months) }
mInfoView.lbYearsExperience.text = String.format("%s%s Exp.", yearsText, monthsText)

先谢谢你的解释或帮助。

答案

> 是一个被覆盖的操作符。它只是一个语法糖。

所以你的if语句实际上是这样的。months?.toInt().compareTo(1)

为了让它工作,你需要给它一个默认值,就像这样: months?.toInt()?:0 > 1.

你可以在这里阅读更多关于操作符重载的内容。https:/kotlinlang.orgdocsreferenceoperator-overloading.html。

以上是关于希望对Android应用中的Kotlin非空断言错误进行解释。的主要内容,如果未能解决你的问题,请参考以下文章

用 Kotlin 编写的 Android 库,提供对 Java 应用程序的支持

用 Kotlin 编写的 Android 库,提供对 Java 应用程序的支持

Kotlin中的? 、?. 、?: 、!!、as?

猫王运算符与非空断言:这些语句之间的区别?

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

使用 Kotlin 从 Android 上 ViewModel 中的 LiveData 更新 ListView 中的元素