为什么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中使用断点,它也能正常工作。
答案 0 :(得分:0)
它取决于Groovy Object#asBoolean。 默认情况下,如果object为null,则返回false。
将对象实例强制转换为布尔值。一个对象被强制执行 如果它不为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。