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 啊 - 你想用check
和key
完成什么?你需要?:
做什么?【参考方案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(使用 ; 在同一行分隔表达式)的主要内容,如果未能解决你的问题,请参考以下文章