Why don't I get a NullPointerException in Groovy in this case?
开发者_开发技巧I have this test code:
def test = null
test.each { }
Why don't I get any exception?
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
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.
精彩评论