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

时间:2011-03-29 12:52:05

标签: groovy null

我有这个测试代码:

def test = null

test.each {  } 

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

2 个答案:

答案 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]

你会得到输出。