理想情况下,我认为注释掉的 if 语句更有意义,至少对我而言。我的意思是,如果有人问我 null 是否大于 0,我会回答不。或者如果 null 为真,那么也不是。但是这些并没有像我预期的那样工作,并引发编译错误。所以,我已经改变了下面的那些。但那些看起来并不好或简洁。有没有更好的方法来处理这些?
class Result(val code:Int)
{
}
fun getResult():Result?
{
return null;
}
fun main(args: Array<String>)
{
var result = getResult();
var success:Boolean? = null;
//if(result?.code > 0)
if(result?.code?:0 > 0)
{
print("Good.");
}
//if(success)
if(success == true)
{
print("Good.");
}
}
最佳答案
注释掉的代码无法编译的原因是因为 result?.code
可以为空,并且您不能在可空表达式上调用比较运算符(即本例中的 >
),因为它们的类型不匹配。 (它被定义为只接受不可为空的类型)
Kotlin 完全消除了可空实体和不可空实体之间的歧义。因此,在编译时 kotlin 编译器拒绝编译,如果您将某些内容与可空类型进行比较,以避免提前运行时异常。在Java中,
Integer x = null;
System.out.println(x > `)
这会编译但在运行时抛出 NullPointerException
,这显然是您不想要的。 Kotlin 编译器在这里很聪明,通过拒绝编译来避免此类运行时异常。现在讨论更好的处理方法,就像大家说的那样,使用
let
是一种合适的方法。一种更简单的方法可以是使用 if 表达式进行常规空检查if(result != null && result.code > 0) {
print("Good.");
}
关于Kotlin:检查可空值在 if 语句中是否有效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48435159/