在这种情况下,为什么我在Groovy中没有得到NullPointerException?

res*_*es1 13 null groovy

我有这个测试代码:

def test = null

test.each {  } 
Run Code Online (Sandbox Code Playgroud)

为什么我没有得到任何例外?

Dón*_*nal 11

each试图以零安全的方式调用iterator它的目标方法的实现.如果在空对象或没有方法的对象上调用,则不会发生任何事情.eachiterator

我还没有看到源代码,但它可能看起来像这样

Object each(Closure closure) {

  if (this?.respondsTo("iterator")) {

    def iterator = this.iterator()

    while (iterator.hasNext() {
      def item = iterator.next()
      closure(item)
    }
  }
  return this
}
Run Code Online (Sandbox Code Playgroud)

§实际上,这种方法可能是用Java而不是Groovy编写的

  • 实际上,它位于`org.codehaus.groovy.runtime.NullObject.java`中,其中有一个定义为`public Iterator iterator(){return Collections.EMPTY_LIST.iterator(); 因此``NullObject`(`null`)在被`each`查询时将`Iterator`返回到空`List` (7认同)