while statement loop for example español enhanced array java syntax loops for-loop

java - statement - Verificación nula en un bucle forzado mejorado



java for example (11)

Con Java 8 Optional :

for (Object object : Optional.ofNullable(someList).orElse(Collections.emptyList())) { // do whatever }

¿Cuál es la mejor manera de protegerse de null 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 insertado en el constructo, si es nulo, entonces no ejecutar el ciclo?


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 lado y no sabe si está bien o no, podría crear un método de utilidad y usarlo así:

for( Object o : safe( list ) ) { // do whatever }

Y, por supuesto, safe sería:

public static List safe( List other ) { return other == null ? Collections.EMPTY_LIST : other; }


He modificado la respuesta anterior, por lo que no es necesario enviar contenido desde Object

public static <T> List<T> safeClient( List<T> other ) { return other == null ? Collections.EMPTY_LIST : other; }

y luego simplemente llame a la Lista por

for (MyOwnObject ownObject : safeClient(someList)) { // do whatever }

Explicación: MyOwnObject: If List<Integer> entonces MyOwnObject será Integer en este caso.


Otra forma de protegerse efectivamente contra un nulo en un bucle for es envolver su colección con la Optional<T> Google Guava, ya que esto, espera, hace que la posibilidad de una recolección efectivamente vacía sea clara, ya que se esperaría que el cliente verificara si la colección está presente con Optional.isPresent() .


Para cualquiera que no esté interesado en escribir su propio método de seguridad nulo estático, puede usar: org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object) commons-lang org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object) . Por ejemplo:

for (final String item : (List<String>)ObjectUtils.defaultIfNull(items, Collections.emptyList())) { ... }

ObjectUtils.defaultIfNull JavaDoc


Podría escribir un método auxiliar que devuelva una secuencia vacía si pasó en nulo:

public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) { return iterable == null ? Collections.<T>emptyList() : iterable; }

Luego usa:

for (Object object : emptyIfNull(someList)) { }

Sin embargo, no creo que realmente haga eso, generalmente usaría tu segunda forma. En particular, el "o throw ex" es importante; si realmente no debería ser nulo, definitivamente debes lanzar una excepción. Sabes que algo salió mal, pero no sabes la extensión del daño. Abortar temprano.


Si obtiene esa List de una llamada a método que implementa, no devuelva null , devuelva una List vacía.

Si no puede cambiar la implementación, entonces está atascado con la verificación null . Si no debería ser null , entonces lanza una excepción.

No utilizaría el método de ayuda que devuelve una lista vacía porque puede ser útil algunas veces, pero luego se acostumbraría a llamarlo en cada ciclo que haga, posiblemente ocultando algunos errores.


Utilice el método CollectionUtils.isEmpty(Collection coll) que es comprobación de seguridad nula si la colección especificada está vacía.

para esta import org.apache.commons.collections.CollectionUtils .

Dependencia Maven

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.0</version> </dependency>


Ya es 2017, y ahora puedes usar Apache Commons Collections4

El uso:

for(Object obj : ListUtils.emptyIfNull(list1)){ // Do your stuff }

Puede hacer la misma comprobación de seguridad nula a otras clases de CollectionUtils.emptyIfNull con CollectionUtils.emptyIfNull .


TL; DR Utilice ArrayUtils.nullToEmpty de la biblioteca commons-lang para matrices

for( Object o : ArrayUtils.nullToEmpty(list) ) { // do whatever }

Esta funcionalidad existe en la biblioteca commons-lang , que se incluye en la mayoría de los proyectos de Java.

// ArrayUtils.nullToEmpty source code public static Object[] nullToEmpty(final Object[] array) { if (isEmpty(array)) { return EMPTY_OBJECT_ARRAY; } return array; } // ArrayUtils.isEmpty source code public static boolean isEmpty(final Object[] array) { return array == null || array.length == 0; }

Esto es lo mismo que la respuesta de @OscarRyz, pero por el mantra DRY , creo que vale la pena señalarlo. Vea la página del proyecto commons-lang . Aquí está la source y la documentation API nullToEmpty

Entrada de Maven para incluir commons-lang en su proyecto si aún no lo está.

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency>

Lamentablemente, commons-lang no proporciona esta funcionalidad para los tipos de List . En este caso, debería usar un método auxiliar como se mencionó anteriormente.

public static <E> List<E> nullToEmpty(List<E> list) { if(list == null || list.isEmpty()) { return Collections.emptyList(); } return list; }


for (Object object : someList) { // do whatever } throws the null pointer exception.