Istruzione continue in Java
Salta il resto dell'iterazione corrente in Java con l'istruzione continue, incluso il continue con etichetta.
continue è il cugino leggero di break. Mentre break dice interrompi completamente il ciclo, continue dice salta il resto di questa iterazione e inizia la prossima. Il ciclo continua a girare.
Questa pagina spiega come continue riprende l'esecuzione per ogni tipo di ciclo, la trappola del ciclo infinito nei cicli while, il suo utilizzo per filtrare elementi, quando preferirlo a una condizione if invertita e come influisce solo sul ciclo più interno.
Uso di base
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue;
}
System.out.println(i);
}Output:
0
1
3
4Quando i == 2, continue salta direttamente al passo di aggiornamento del ciclo (i++), ignorando println. Il ciclo rivaluta quindi la sua condizione e procede con i == 3.
Come riprendono i cicli
Il comportamento dipende dal tipo di ciclo:
for— esegue l'espressione di aggiornamento, poi controlla la condizionewhile— controlla immediatamente la condizionedo/while— controlla immediatamente la condizione (in fondo al ciclo)foravanzato — passa all'elemento successivo
Un continue in un ciclo while che dimentica di avanzare lo stato può rapidamente diventare un ciclo infinito:
int i = 0;
while (i < 5) {
if (i == 2) {
continue; // i never advances — infinite loop!
}
System.out.println(i);
i++;
}Questo è un errore classico. Incrementa prima del continue, oppure usa un ciclo for in modo che il passo di aggiornamento venga eseguito automaticamente.
Filtrare gli elementi
L'uso più comune di continue è "salta gli elementi che non mi interessano":
int[] nums = {3, 7, 2, 8, 5, 4};
for (int n : nums) {
if (n % 2 != 0) {
continue; // skip odd numbers
}
System.out.println(n);
}Output: 2 8 4.
continue vs. inversione della condizione
Spesso è possibile riscrivere un continue come un if che racchiude il resto del corpo:
for (int n : nums) {
if (n % 2 == 0) {
System.out.println(n);
}
}Funzionalmente identici. La scelta dipende dallo stile:
- Usa
continuequando ci sono più condizioni di salto; una serie di guardie early-out è più piatta rispetto aifprofondamente annidati. - Usa un
ifcontenitore quando la condizione di salto è semplice e il corpo è breve.
// continue style — easy to add another skip condition
for (User u : users) {
if (u == null) continue;
if (!u.isActive()) continue;
if (u.isBanned()) continue;
process(u);
}continue salta solo un livello
Come break, continue agisce sul ciclo più interno che lo racchiude:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 1) continue; // only skips inner iteration
System.out.println(i + "," + j);
}
}Output:
0,0
0,2
1,0
1,2
2,0
2,2Per usare continue sul ciclo esterno dall'interno di quello interno, usa un continue con etichetta — trattato in istruzioni con etichetta.
Un esempio completo
Cosa c'è dopo
Combinando i cicli for, si ottengono i cicli annidati — la base per lavorare con griglie, tabelle e array bidimensionali.