【发布时间】:2011-03-29 12:52:05
【问题描述】:
我有这个测试代码:
def test = null
test.each { }
为什么我没有得到任何异常?
【问题讨论】:
-
@tim_yates 感谢您提供相关问题的链接
我有这个测试代码:
def test = null
test.each { }
为什么我没有得到任何异常?
【问题讨论】:
each 的实现尝试以空安全方式调用其目标的iterator 方法。如果在空对象或没有iterator 方法的对象上调用each,则不会发生任何事情。
我还没有看到源代码,但它可能看起来像这样§
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 编写的
【讨论】:
org.codehaus.groovy.runtime.NullObject.java,其中有一个方法定义为public Iterator iterator() { return Collections.EMPTY_LIST.iterator(); } 所以NullObject (null) 在被查询时返回一个Iterator 到一个空的List each
使用 each 闭包时的 null 值与具有 0 个元素的集合相同。如果你有代码
def test=null
test.each {println "In closure with value "+it}
打印语句不会执行。如果您将测试更改为
def test=[1,2,3]
你会得到输出。
【讨论】: