问题
I have this test code:
def test = null
test.each { }
Why don't I get any exception?
回答1:
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
回答2:
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.
来源:https://stackoverflow.com/questions/5472795/why-dont-i-get-a-nullpointerexception-in-groovy-in-this-case