Kotlin:检查if语句中的可空值是否有效

时间:2018-01-25 03:29:05

标签: kotlin

理想情况下,我认为注释掉的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.");
    }
}

4 个答案:

答案 0 :(得分:3)

>被编译为compareTo(other: Int)的调用,按惯例工作(在operator上定义为Int)。但是,您无法在可空Int?上调用此函数。

有一种解决方法:在Int?上创建另一个扩展程序:

operator fun Int?.compareTo(other: Int): Int =
    (this ?: 0).compareTo(other)

现在你的电话确实有效:

if (result?.code > 0)
    print("Good.")

答案 1 :(得分:1)

可空元素实际上是Result实例本身,而不是其code属性。

我认为将let与安全获取运算符结合使用可以更准确地反映代码的设计:

    result?.let {
        if(it.code > 0) {

        }
    }

答案 2 :(得分:1)

注释掉的代码没有编译的原因是因为result?.code可以为空并且你不能在可空表达式上调用比较运算符(即>),因为它们不是类型匹配。 (它被定义为只接受不可为空的类型)

  

如果null大于0,那么我会回答否。或者如果null为真,那么也没有

Kotlin完全消除了可空和非可空实体之间的歧义。因此,在编译时,如果要与可空类型进行比较,kotlin编译器会拒绝编译,以提前避免运行时异常。在java中,

Integer x = null;
System.out.println(x > `)

这会编译但会在运行时抛出NullPointerException,这显然是你不想要的。 Kotlin编译器在这里很聪明,通过拒绝编译来避免这种运行时异常。

现在更好地处理它,就像所有人说的那样,使用let是一种合适的方法。一种更简单的方法可以是使用if expresion进行常规空值检查

if(result != null && result.code > 0) {
    print("Good.");
}

答案 3 :(得分:0)

result?.code > 0

它无效,因为>内部调用compareTo()方法。 compareTo()方法不适用于可空对象。这就是为什么您必须在变量code上添加 elvis 运算符(?:)以在code变量为compareTo()变量时分配值空值。因此该值不为null,然后result?.code?:0 > 0 方法有效。

let

我添加了result来解决。如果let不为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."); } // Updated Code result?.let{ if(result.code > 0) print("Good.") } //if(success) if(success == true){ print("Good."); } } 块中执行代码。请检查更新的代码。

desc A.name;