2010-10-21 12 views
18

Perché il ciclo perfezionato per non esegue il controllo Null prima di ripetere l'iterazione sulla raccolta.Perché il ciclo avanzato non esegue il controllo nullo

+1

è possibile specificare alcuni dettagli circa il codice e quello che stai facendo? –

+1

Immagino che la domanda riguardi perché 'per (X y: (Lista ) null) {...}' sta lanciando un NPE ... –

+0

duplicato di http://stackoverflow.com/questions/2250031 –

risposta

31

Se vuoi dire che questo sarebbe andato botto:

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

... allora penso che sia del tutto appropriato per quella di gettare un NullPointerException. L'alternativa sarebbe quella di inghiottire silenziosamente il null e trattarlo come equivalente a un array vuoto. Questo non è l'approccio che Java usa altrove: perché dovrebbe essere diverso? Renderebbe la lingua incoerente.

L'unico posto in cui mi piacerebbe che ci erano più maneggevolezza (ma movimentazione esplicito) sta passando su un enum - sarebbe bello essere in grado di fornire un caso per nulla, al fine di evitare il controllo per che un valore speciale in anticipo. Ma questo è un costrutto molto diverso, che sta specificatamente cercando di intraprendere azioni diverse per valori diversi.

+3

Un caso 'null' per l'attivazione di enumerazioni è interessante idea, ma cosa dovrebbe accadere se si ha un 'default:' ma nessun 'caso nullo esplicito: 'e il valore enum è' null'. Se 'null' va al caso predefinito che interrompe la compatibilità con le versioni precedenti, ed è cattivo se' null' è un valore errato. Se ottieni un NPE, allora 'default' si comporta in modo semanticamente incoerente. (Ora significa "predefinito a meno che non sia null ...") –

+1

@Stephen C: buone domande. Non sono sicuro che sia una buona idea presentarlo * ora *, ma penso che sarebbe stato opportuno prendere in considerazione quando la funzionalità è stata introdotta per la prima volta. –

+0

Penso che ci siano abbastanza "rughe" che sarebbe (ipoteticamente) una cattiva idea anche allora. Forse se Java 1.0 avesse avuto anche tune nullable ... –

5

Ho paura di affermare contro Jon Skeet ...: | ... Ma che diavolo ... cosa ne pensi su questo scenario ?:

`

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

`

Se chiedo qualche cliente di dirmi dove cercare e lui non mi dice niente Pensi che sia meglio qui lanciare una NullPointerException? Può essere gestita la chiamata a questo metodo quindi se il parametro è nullo non lo si chiama? .... Penso che il ritorno 0 sia una risposta consistente perché non ci sono errori qui. Credo che siano fatte eccezioni per gestire il flusso di codice e non vedo perché dovrei cambiare il flusso in questo tipo di situazione. Restituire un cero o anche un null potrebbe essere una buona risposta, non potrebbe essere?

Quindi, per quanto riguarda questa soluzione? `

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

`

+0

Questo è stato davvero utile. Non ho mai visto le 'Collezioni. emptyList() 'idioma prima. Mi sarei aspettato che fosse 'Collections.emptyList ()' se potessi farlo, ma apparentemente no. Sai dove è documentato questo idioma? Sto avendo difficoltà a trovarlo. –

+0

Stavo cercando di trovarlo! Non potrei ... è un .. segreto? :) Scusa –

+0

Oh bene, grazie per aver provato comunque. È difficile da cercare. –

1

Il codice deve essere simile a questo:

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; 
} 
Problemi correlati