2010-10-21 12 views
18

Por qué el bucle for mejorado no está realizando una comprobación nula antes de iterar sobre la colección.Por qué Enhanced for loop no está realizando la comprobación nula

+1

¿Puede especificar algunos detalles más sobre su código y lo que está haciendo? –

+1

Imagino que la pregunta es por qué 'for (X y: (Lista ) null) {...}' está lanzando un NPE ... –

+0

duplicado de http://stackoverflow.com/questions/2250031 –

Respuesta

31

Si se refiere a que esto iría explosión:

int[] array = null; 
for (int x : array) { 
} 

... entonces creo que es del todo adecuado para esa lanzar una NullPointerException. La alternativa sería que trague silenciosamente el nulo y lo considere equivalente a un conjunto vacío. Ese no es el enfoque que Java toma en ningún otro lado: ¿por qué debería ser diferente? Haría que el lenguaje fuera inconsistente.

El único lugar me gustaría que eran manejo más (pero la manipulación explícita) es cambiar de una enumeración - sería agradable ser capaz de proporcionar un caso para nulo, para evitar la comprobación de que un valor especial de antemano. Pero esa es una construcción muy diferente, que trata específicamente de tomar diferentes acciones para diferentes valores.

+3

Un caso 'nulo' para encender enums es un tema interesante idea, pero lo que debería suceder si tiene un 'default:' pero no un 'case null:' explícito y el valor enum es 'null'. Si el 'nulo' va al caso predeterminado que rompe la compatibilidad hacia atrás, y es malo si' nulo' es un valor erróneo. Si obtiene un NPE, entonces 'default' se comporta de una manera semánticamente inconsistente. (Ahora significa "predeterminado a menos que sea nulo ...") –

+1

@Stephen C: Buenas preguntas. No estoy seguro de que sea una buena idea presentarlo * ahora *, pero creo que hubiera sido bueno considerarlo cuando se presentó la función por primera vez. –

+0

Creo que hay suficientes "arrugas" que (hipotéticamente) habría sido una mala idea incluso entonces. Tal vez si Java 1.0 también hubiera tenido tipeo con nulos ... –

5

Tengo miedo de afirmar contra Jon Skeet ...: | ... Pero qué diablos ... ¿qué opinas sobre este escenario ?:

`

findMoney(List<Places> places){ 
    int money = 0; 
    for(Place place : places){ 
    money += searchWithCare(place); 
    } 
return money; 
} 

`

Si le pido a algún cliente que me diga dónde buscar y él no me dice nada ¿Crees que es mejor lanzar una NullPointerException? Puede administrar la llamada a este método así que si el parámetro es nulo, ¿no lo llama? .... Creo que return 0 es una respuesta consistente porque no hay error aquí. Creo que se hacen excepciones para administrar el flujo de código y no veo por qué debería cambiar el flujo en este tipo de situación. Devolver un cero o incluso un nulo podría ser una buena respuesta, ¿no podría ser?

¿Qué tal esta solución? `

findMoney(List<Places> places){ 
    int money = 0; 
    for(Place place : places == null ?Collections.<Place>emptyList():places){ 
    money += searchWithCare(place); 
    } 
return money; 
} 

`

+0

Esto fue realmente útil. Nunca he visto las 'Colecciones. emptyList() 'idioma antes. Esperaría que fuera 'Collections.emptyList ()' si pudieras hacer eso, pero aparentemente no. ¿Sabes dónde está documentado este idioma? Tengo problemas para encontrarlo. –

+0

¡Estaba intentando encontrarlo! No pude ... es un ... secreto? :) Lo siento –

+0

Oh, bueno, gracias por intentarlo de todos modos. Es difícil de buscar. –

1

El código debe ser como este:

for (AnyObject anyObject : checkIsEmpty(anyObjectList)) { 
     System.out.println(anyObject.doSomething()); 
} 

private <T> Iterable<T> checkIsEmpty(Iterable<T> iterable) { 
     return iterable == null ? Collections.<T>emptyList() : iterable; 
}