Why don't I get a NullPointerException in Groovy in this case?

前端 未结 2 568
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-11 12:02

I have this test code:

def test = null

test.each {  } 

Why don\'t I get any exception?

相关标签:
2条回答
  • 2021-01-11 12:34

    A null value when using the each closure is the same as a collection with 0 elements. If you have the code

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

    The print statement won't execute. If you change test to

    def test=[1,2,3]
    

    you will get output.

    0 讨论(0)
  • 2021-01-11 12:54

    The implementation of each tries to call the iterator method of it's target in a null-safe fashion. If each is called on a null object, or an object without an iterator method, nothing happens.

    I haven't seen the source code, but it could look something like this§

    Object each(Closure closure) {
    
      if (this?.respondsTo("iterator")) {
    
        def iterator = this.iterator()
    
        while (iterator.hasNext() {
          def item = iterator.next()
          closure(item)
        }
      }
      return this
    }
    

    § In reality, this method is probably written in Java rather than Groovy

    0 讨论(0)
提交回复
热议问题