Почему в этом случае я не получаю исключение NullPointerException в Groovy? - PullRequest
13 голосов
/ 29 марта 2011

У меня есть этот тестовый код:

def test = null

test.each {  } 

Почему я не получаю никаких исключений?

Ответы [ 2 ]

11 голосов
/ 29 марта 2011

Реализация 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

2 голосов
/ 29 марта 2011

Нулевое значение при использовании каждого замыкания такое же, как у коллекции с 0 элементами.Если у вас есть код

def test=null
test.each {println "In closure with value "+it}

Оператор печати не будет выполнен.Если вы измените тест на

def test=[1,2,3]

, вы получите вывод.

...