Groovy在检查null时跳过JsonNode对象,即使它们不为null

时间:2014-12-18 13:45:49

标签: groovy

为什么Groovy会跳过这个if语句?

public static void main(String[] args) {
    JsonNode jsonNode = JsonNodeFactory.instance.objectNode()
    if (jsonNode) {
        println 'It works' //doesn't print it
    }
}

显式检查null效果很好:

public static void main(String[] args) {
    JsonNode jsonNode = JsonNodeFactory.instance.objectNode()
    if (jsonNode != null) {
        println 'It works' //works well
    }
}

进口:

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.node.JsonNodeFactory
import com.fasterxml.jackson.databind.node.ObjectNode

此外,如果我在Intellij中使用断点,它也能正常工作。

1 个答案:

答案 0 :(得分:0)

它取决于Groovy Object#asBoolean。 默认情况下,如果object为null,则返回false。

asBoolean()

  

将对象实例强制转换为布尔值。一个对象被强制执行   如果它不为null,则返回true;如果为null,则返回false。

当有这样的检查时,Groovy尝试使用asBoolean()将对象强制转换为boolean。 这个例子表明:

public static void main(String[] args) {
    AsBoolFalse asBoolFalse = new AsBoolFalse()
    if (asBoolFalse) {
        println 'AsBoolFalse doesn\'t work' //doesn't print it
    }

    AsBoolTrue asBoolTrue = new AsBoolTrue()
    if (asBoolTrue) {
        println 'AsBoolTrue works' //works well
    }
}

static class AsBoolFalse {
    public boolean asBoolean() {
        return false
    }
}

static class AsBoolTrue {
    public boolean asBoolean() {
        return true
    }
}

JsonNode重写asBoolean()以返回false,因此我们需要显式检查null。