¿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 forconstrucción en sí, si es nulo, entonces no ejecute el ciclo?

nullNo 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
safesería:fuente
emptyListjava.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
emptyIfNullesIterable<T>: hay unremovemé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 deOptionalobjeto.Uso
ArrayUtils.nullToEmptyde lacommons-langbiblioteca para matricesEsta funcionalidad existe en la
commons-langbiblioteca, 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
nullToEmptyAPIEntrada de Maven para incluir
commons-langen su proyecto si aún no lo está.Desafortunadamente,
commons-langno proporciona esta funcionalidad para losListtipos. En este caso, tendría que usar un método auxiliar como se mencionó anteriormente.fuente
Si obtiene eso
Listde 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
nullverificació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