determina l'ordine in cui le istruzioni vengono eseguite. Java fornisce condizionali (, ), cicli (, , ) e istruzioni di ramificazione (, , ) — più i miglioramenti moderni come le switch expression.
determina l'ordine in cui le istruzioni vengono eseguite. Java fornisce condizionali (, ), cicli (, , ) e istruzioni di ramificazione (, , ) — più i miglioramenti moderni come le switch expression.
ifswitchforwhiledo-whilebreakcontinuereturnif (score >= 90) {
grade = "A";
} else if (score >= 80) {
grade = "B";
} else {
grade = "F";
}
// ternary — concise if/else for a value
String status = (age >= 18) ? "adult" : "minor";
switch (day) {
case 1: name = "Mon"; break; // ⚠️ break needed — else it FALLS THROUGH
case 2: name = "Tue"; break;
default: name = "Unknown";
}
Il switch classico richiede break dopo ogni case — dimenticarlo causa fall-through (l'esecuzione continua nel case successivo), una fonte notoria di bug.
// arrow syntax: no fall-through, returns a value, more concise
String name = switch (day) {
case 1 -> "Mon";
case 2 -> "Tue";
case 6, 7 -> "Weekend"; // multiple labels
default -> "Unknown";
};
La switch expression moderna elimina il fall-through, può restituire un valore ed è più pulita — preferita nel nuovo codice.
// for — known iteration count
for (int i = 0; i < 10; i++) { ... }
// enhanced for-each — iterate a collection/array
for (String item : items) { ... }
// while — condition checked BEFORE each iteration
while (condition) { ... }
// do-while — body runs at least ONCE (condition checked after)
do { ... } while (condition);
for (int i = 0; i < 10; i++) {
if (i == 5) break; // exit the loop entirely
if (i % 2 == 0) continue; // skip to the next iteration
}
return result; // exit the method
// labeled break — exit nested loops
outer:
for (...) {
for (...) {
if (found) break outer; // breaks BOTH loops
}
}
break esce da un ciclo, continue salta all'iterazione successiva, return esce dal metodo, e i break etichettati possono uscire da cicli annidati contemporaneamente.
Il control flow è il meccanismo fondamentale per esprimere la logica e le decisioni in qualsiasi programma — ogni metodo non banale lo utilizza.
Capire i costrutti e le loro sfumature è essenziale: il gotcha del fall-through dello switch (e la più sicura switch expression moderna), la differenza tra while e do-while (esecuzione almeno una volta), il for-each per l'iterazione pulita delle collezioni, e le istruzioni di ramificazione (inclusi i break etichettati per cicli annidati).
Padroneggiare questi — e preferire le forme moderne, meno soggette a errori (switch expression, for-each) — è fondamentale per scrivere logica Java corretta e leggibile e per evitare bug comuni di control flow.