Kotlin Null 安全警告 Unexpected tokens(使用 ; 在同一行分隔表达式)

Posted

技术标签:

【中文标题】Kotlin Null 安全警告 Unexpected tokens(使用 ; 在同一行分隔表达式)【英文标题】:Kotlin Null safety warning Unexpected tokens (use ; to seperate expressions on the same line) 【发布时间】:2018-05-18 07:29:11 【问题描述】:

我在我的应用程序中尝试使用 Kotlin 代码中的 Elvis operator 并收到以下警告:

Unexpected tokens (use ; to seperate expressions on the same line)

代码:

    var key: String = "KEY is"
    /* "check" is name of String variable which can be null
    Warning coming on following statement*/
    var str : String = check?key.replace("KEY", "ABDS-ASDSA-DSSS")?:check

任何想法如何解决这个问题?

【问题讨论】:

为什么要使用猫王算子?您的变量都不能为空,因此毫无意义。此外,您永远不会初始化 check Kotlin Ternary Conditional Operator的可能重复 【参考方案1】:

我不明白为什么您需要任何空安全运算符。您的所有变量都不能为空。


你写的

check?key.replace("KEY", "ABDS-ASDSA-DSSS")?:check

?check 之后)不是 Kotlin 中的运算符。

您可能想要ternary conditional operator, which is simply replaced by if/else

从您的评论来看,您似乎想要safe call 运算符,即?.,而不是?

check?.key?.replace("KEY", "ABDS-ASDSA-DSSS") ?: check

Elvis operator 和安全呼叫运算符之间存在差异。 Elvis 运算符使用表达式,而安全调用运算符只是空安全属性访问或方法调用

如果 Elvis 运算符不为 null,则返回其第一个操作数,否则返回第二个操作数。

?. 运算符如果接收者为 null,则返回 null,否则返回调用结果。

【讨论】:

谢谢。实际上,实际代码与相关代码不同。您可以编辑问题吗? @MalwinderSingh 你是什么意思?如果问题中缺少某些内容,只有您可以添加 - 您是提问者,我不知道您要添加什么 我在询问需要对问题进行哪些更改以澄清问题。 @MalwinderSingh 啊 - 你想用checkkey 完成什么?你需要?: 做什么?【参考方案2】:

kotlin 不支持三元运算符。

甚至check 在您的情况下也不是boolean 变量,使其成为布尔值或使用类似

var check: String = "something here"
 var key: String = "KEY is"
/*Warning coming on following statement*/
 var str : String = key.replace("KEY", "ABDS-ASDSA-DSSS")?:check

【讨论】:

感谢@Irony Stack。实际上,我正在尝试使用 Kotlin 的 Elvis 运算符(kotlinlang.org/docs/reference/null-safety.html#elvis-operator)。你能告诉我为什么猫王操作员不工作吗? 但是key不是check的属性你不能这样使用 @MalwinderSingh 您误解了elvis 运算符的概念,在此声明中val l = b?.length ?: -1 第二个运算符?: 就在-1 之前是elvice 运算符而不是.length 之前的那个 我尝试了您的解决方案。它显示警告:Elvis operator (?:) always returns the left operand of non-nullable type String

以上是关于Kotlin Null 安全警告 Unexpected tokens(使用 ; 在同一行分隔表达式)的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin初级- - - 空安全.md

Kotlin初级- - - 空安全.md

Kotlin学习快速入门——空安全

kotlin小悟-安全调用符

kotlin小悟-安全调用符

Kotlin空安全 ④ ( 手动空安全管理 | 空合并操作符 ?: | 空合并操作符与 let 函数结合使用 )