que tienen este código de prueba:¿Por qué no obtengo una NullPointerException en Groovy en este caso?
def test = null
test.each { }
¿Por qué no puedo obtener ninguna excepción?
que tienen este código de prueba:¿Por qué no obtengo una NullPointerException en Groovy en este caso?
def test = null
test.each { }
¿Por qué no puedo obtener ninguna excepción?
La implementación de each
trata de llamar al método iterator
de su blanco de una manera segura nulo. Si se llama a each
en un objeto nulo, o un objeto sin un método iterator
, no ocurre nada.
No he visto el código fuente, pero podría ser algo como this§
Object each(Closure closure) {
if (this?.respondsTo("iterator")) {
def iterator = this.iterator()
while (iterator.hasNext() {
def item = iterator.next()
closure(item)
}
}
return this
}
§ En realidad, este método es probablemente escrito en Java en lugar de maravilloso
En realidad, está en 'org.codehaus .groovy.runtime.NullObject.java', donde hay un método definido como 'public Iterator iterator() {return Collections.EMPTY_LIST.iterator(); } 'Así que el' NullObject' ('null') devuelve un' Iterator' a una 'Lista' vacía cuando es consultado por' each' –
@tim_yates gracias, pero prefiero mi implementación :) –
Hehe, disfrutando demasiado de tu mundo de fantasía ¿eh? ;-) –
Un valor nulo al usar cada cierre es lo mismo que una colección con 0 elementos. Si tiene el código
def test=null
test.each {println "In closure with value "+it}
La instrucción de impresión no se ejecutará. Si cambia la prueba a
def test=[1,2,3]
obtendrá la salida.
questiuon relacionada aquí: http : //stackoverflow.com/questions/2480195/what-is-the-purpose-of-the-nullobject-class-in-groovy –
@tim_yates gracias por el enlace a la pregunta relacionada – res1