我有这个测试代码:
def test = null
test.each { }
为什么我没有得到任何例外?
答案 0 :(得分:11)
each
的实现尝试以零安全的方式调用目标的iterator
方法。如果在空对象或没有each
方法的对象上调用iterator
,则不会发生任何事情。
我还没有看到源代码,但它可能看起来像这样
Object each(Closure closure) {
if (this?.respondsTo("iterator")) {
def iterator = this.iterator()
while (iterator.hasNext() {
def item = iterator.next()
closure(item)
}
}
return this
}
§实际上,这种方法可能是用Java而不是Groovy编写的
答案 1 :(得分:2)
使用每个闭包时的空值与具有0个元素的集合相同。如果你有代码
def test=null
test.each {println "In closure with value "+it}
print语句不会执行。如果您将测试更改为
def test=[1,2,3]
你会得到输出。