¿Cuál es la mejor manera de protegerse contra nulo en un bucle for en Java?
Esto parece feo:
if (someList != null) {
for (Object object : someList) {
// do whatever
}
}
O
if (someList == null) {
return; // Or throw ex
}
for (Object object : someList) {
// do whatever
}
Puede que no haya otra forma. ¿Deberían haberlo puesto en la for
construcción en sí, si es nulo, entonces no ejecute el ciclo?
null
No es lo mismo que una colección vacía.Respuestas:
Debería verificar mejor de dónde obtiene esa lista.
Una lista vacía es todo lo que necesita, porque una lista vacía no fallará.
Si obtiene esta lista de otro lugar y no sabe si está bien o no, podría crear un método de utilidad y usarlo así:
Y por supuesto
safe
sería:fuente
emptyList
java.sun.com/j2se/1.5.0/docs/api/java/util/… ¿Qué es el IIRC?Potencialmente, podría escribir un método auxiliar que devuelva una secuencia vacía si pasa nulo:
Luego use:
Sin embargo, no creo que realmente haga eso, generalmente usaría su segunda forma. En particular, "o throw ex" es importante: si realmente no debería ser nulo, definitivamente debe lanzar una excepción. Sabes que algo salió mal, pero no sabes el alcance del daño. Abortar temprano.
fuente
emptyIfNull
esIterable<T>
: hay unremove
método desafortunadoIterator<T>
, pero ese es el único aspecto mutable del mismo (y si tiene una colección vacía, ¿por qué está tratando de eliminar algo de ella?) No está claro qué es ' re objetando aquí.Ya es 2017, y ahora puedes usar Apache Commons Collections4
El uso:
Puede hacer la misma comprobación de seguridad nula para otras clases de colección con
CollectionUtils.emptyIfNull
.fuente
Collections.emptyList()
internamente, lo que a su vez siempre devuelve la misma lista vacía no modificable preasignada.Con Java 8
Optional
:fuente
someList != null ? someList : Collections.emptyList()
y también crea e inmediatamente arroja una instancia deOptional
objeto.Uso
ArrayUtils.nullToEmpty
de lacommons-lang
biblioteca para matricesEsta funcionalidad existe en la
commons-lang
biblioteca, que se incluye en la mayoría de los proyectos Java.Esto es lo mismo que la respuesta dada por @OscarRyz, pero por el bien del mantra DRY , creo que vale la pena señalar. Vea la página del proyecto commons-lang . Aquí está la documentación y la fuente de la
nullToEmpty
APIEntrada de Maven para incluir
commons-lang
en su proyecto si aún no lo está.Desafortunadamente,
commons-lang
no proporciona esta funcionalidad para losList
tipos. En este caso, tendría que usar un método auxiliar como se mencionó anteriormente.fuente
Si obtiene eso
List
de una llamada a un método que implementa, no devuelvanull
, devuelva un vacíoList
.Si no puede cambiar la implementación, entonces está atascado con la
null
verificación. Si no debería ser asínull
, lanza una excepción.No elegiría el método auxiliar que devuelve una lista vacía porque puede ser útil algunas veces, pero luego te acostumbrarías a llamarlo en cada bucle que hagas, posiblemente ocultando algunos errores.
fuente
He modificado la respuesta anterior, por lo que no necesita lanzar desde Object
y luego simplemente llame a la Lista por
Explicación: MyOwnObject: si es
List<Integer>
así, MyOwnObject será Integer en este caso.fuente
Otra forma de protegerse eficazmente contra un nulo en un bucle for es envolver su colección con Google Guava's
Optional<T>
ya que esto, se espera, deja en claro la posibilidad de una colección efectivamente vacía, ya que se esperaría que el cliente verifique si la colección está presenteOptional.isPresent()
.fuente
Para cualquiera que no esté interesado en escribir su propio método de seguridad nulo estático, puede usar: commons-lang's
org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)
. Por ejemplo:ObjectUtils.defaultIfNull JavaDoc
fuente
Use,
CollectionUtils.isEmpty(Collection coll)
método que es Null-safe check si la colección especificada está vacía.para esto
import org.apache.commons.collections.CollectionUtils
.Dependencia Maven
fuente
fuente