检查 null 后显示 Null 安全错误
Null safety error showing after checking for null
我执行一个函数 (listOf(matchUid, first_name, gender, matchBio, age).any { it == null }
) 检查传入的任何变量是否为 null
:
private fun getMatchData(doc: DocumentSnapshot){
val matchUid = if (isUser1) doc.getString("user2") else doc.getString("user1")
val first_name = if (isUser1) doc.getString("user2name") else doc.getString("user1name")
val gender = if (isUser1) doc.getString("user2gender") else doc.getString("gender")
val matchBio = if (isUser1) doc.getString("user2bio") else doc.getString("user1bio")
if ( listOf(matchUid, first_name, gender, matchBio, age).any { it == null } ) return goOffline()
if (matchUid == null) return goOffline()
if (!isUser1) Group = Group().apply {
id = doc.id
user1 = matchUid
user2 = user.uid
match = User(matchUid, first_name, gender, null, true)
}
尽管它检查了这一点,first_name
和 gender
由于 null 安全性而在编译器中带有红色下划线。 matchUid
没有红线,因为我在下面的行中明确检查了它是否为 null。
为什么编译器在我已经检查之后仍然给出空警告?
所以,问题是编译器不够智能,或者...我们没有提供足够的信息。
在您的情况下,您确保 firstName
和 gender
不为空的有问题的调用是:
if (listOf(matchUid, firstName, gender, matchBio, age).any { it == null }) return goOffline()
如果将其更改为简单的空值链,它将正常工作:
if (matchUid == null || firstName == null || gender == null || matchBio == null || age == null) return goOffline()
那么,这是为什么呢?编译器只是不知道 listOf(vararg objects: Any?).any { it == null }
意味着那些对象的 none 不为空。
那么,我们能做什么呢?
Kotlin 1.3 给了我们写 contracts
的很大可能性,这是编译器的一个提示,例如,如果 f(x)
returns true
表示 x
不为空。但是,不幸的是,合同不支持 varargs 参数(或者我还没有找到这样做的方法)。
因此,在您的情况下,您可以将调用替换为单个空值检查链。
我执行一个函数 (listOf(matchUid, first_name, gender, matchBio, age).any { it == null }
) 检查传入的任何变量是否为 null
:
private fun getMatchData(doc: DocumentSnapshot){
val matchUid = if (isUser1) doc.getString("user2") else doc.getString("user1")
val first_name = if (isUser1) doc.getString("user2name") else doc.getString("user1name")
val gender = if (isUser1) doc.getString("user2gender") else doc.getString("gender")
val matchBio = if (isUser1) doc.getString("user2bio") else doc.getString("user1bio")
if ( listOf(matchUid, first_name, gender, matchBio, age).any { it == null } ) return goOffline()
if (matchUid == null) return goOffline()
if (!isUser1) Group = Group().apply {
id = doc.id
user1 = matchUid
user2 = user.uid
match = User(matchUid, first_name, gender, null, true)
}
尽管它检查了这一点,first_name
和 gender
由于 null 安全性而在编译器中带有红色下划线。 matchUid
没有红线,因为我在下面的行中明确检查了它是否为 null。
为什么编译器在我已经检查之后仍然给出空警告?
所以,问题是编译器不够智能,或者...我们没有提供足够的信息。
在您的情况下,您确保 firstName
和 gender
不为空的有问题的调用是:
if (listOf(matchUid, firstName, gender, matchBio, age).any { it == null }) return goOffline()
如果将其更改为简单的空值链,它将正常工作:
if (matchUid == null || firstName == null || gender == null || matchBio == null || age == null) return goOffline()
那么,这是为什么呢?编译器只是不知道 listOf(vararg objects: Any?).any { it == null }
意味着那些对象的 none 不为空。
那么,我们能做什么呢?
Kotlin 1.3 给了我们写 contracts
的很大可能性,这是编译器的一个提示,例如,如果 f(x)
returns true
表示 x
不为空。但是,不幸的是,合同不支持 varargs 参数(或者我还没有找到这样做的方法)。
因此,在您的情况下,您可以将调用替换为单个空值检查链。