Java if, else e else if
Controlla il flusso del programma in Java con if, else if ed else e impara a nidificare le condizioni in modo pulito.
Un programma che esegue sempre la stessa sequenza di istruzioni non è molto utile. if è il modo in cui Java pone una domanda e sceglie cosa fare dopo. Insieme a else if e else, forma la spina dorsale di ogni decisione che il tuo codice dovrà mai prendere.
Il if di base
if (condition) {
// runs only when condition is true
}La condizione deve essere un'espressione boolean — nessun valore truthy/falsy come in JavaScript o Python. if (1) non compila; if (count > 0) sì.
int age = 20;
if (age >= 18) {
System.out.println("You can vote.");
}Aggiungere un else
else fornisce il ramo alternativo — ciò che viene eseguito quando la condizione è false:
int age = 16;
if (age >= 18) {
System.out.println("You can vote.");
} else {
System.out.println("Too young to vote.");
}Esattamente uno dei due rami viene eseguito. Non c'è fall-through.
Concatenare con else if
Per più di due risultati, concatena else if. Java controlla ogni condizione dall'alto verso il basso ed esegue il primo ramo la cui condizione è vera; il resto viene saltato:
int score = 72;
if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 70) {
System.out.println("C");
} else {
System.out.println("F");
}L'ordine è importante. Se metti la condizione più permissiva per prima, essa assorbe tutti i casi successivi. L'esempio sopra stampa C perché score >= 70 è la prima corrispondenza — anche se score >= 60 sarebbe anch'essa vera se venisse controllata.
Le graffe sono opzionali — ma usale
Java ti permette di omettere le graffe quando un ramo è una singola istruzione:
if (loggedIn)
showDashboard();
else
showLogin();Non farlo. Usa sempre le graffe. Le due righe seguenti sembrano uguali ma si comportano diversamente:
if (loggedIn)
showDashboard();
logActivity(); // ALWAYS runs — not part of the if!
if (loggedIn) {
showDashboard();
logActivity(); // both inside the if
}Il costo di {} è due caratteri; il costo del bug è il tuo weekend.
Espressioni boolean dentro if
La condizione può essere qualsiasi cosa che valuti a boolean:
if (x > 0 && x < 100) { ... }
if (name.equals("admin")) { ... }
if (!list.isEmpty()) { ... }
if (user != null && user.isActive()) { ... }Nota che if è un'istruzione, non un'espressione: esegue un'azione ma non produce essa stessa un valore, quindi non puoi scrivere int x = if (...). Per la versione che produce un valore, usa l'Operatore Ternario.
L'ultimo pattern — prima il controllo null, poi una chiamata al metodo — usa la valutazione a corto circuito. Se user è null, user.isActive() non viene mai invocato. Vedi Operatori Logici per &&, || e !, e Operatori di Confronto per >, == e simili.
Nidificare le istruzioni if
Puoi mettere un if all'interno di un altro if. A volte è il modo più chiaro per esprimere una condizione:
if (user != null) {
if (user.isAdmin()) {
System.out.println("Welcome, admin.");
} else {
System.out.println("Welcome, user.");
}
} else {
System.out.println("Please log in.");
}Ma la nidificazione profonda è difficile da leggere. I return anticipati di solito semplificano il codice:
if (user == null) {
System.out.println("Please log in.");
return;
}
if (user.isAdmin()) {
System.out.println("Welcome, admin.");
return;
}
System.out.println("Welcome, user.");Meno indentazione, più facile da seguire.
Errore comune: = invece di ==
I principianti che arrivano da altri linguaggi a volte scrivono:
if (x = 5) { ... } // compile error= è l'assegnazione, == è il confronto. A differenza di C, Java rifiuta questo a tempo di compilazione a meno che la variabile non sia un boolean — perché il risultato di int x = 5 è un int, non un boolean. È una piccola grazia che il sistema di tipi di Java ti offre gratuitamente.
Un esempio pratico
La catena else if qui sotto converte punteggi numerici in voti letterali. Eseguila e verifica l'output:
Stampa:
95 -> A
82 -> B
71 -> C
68 -> D
45 -> FQuando usare switch invece
Una lunga catena else if che testa una variabile rispetto a un elenco di valori fissi è spesso più chiara come istruzione switch. Usa if/else if quando i rami testano espressioni diverse o usano intervalli (come l'esempio dei voti sopra); usa switch quando confronti un singolo valore con diverse costanti.
Cosa c'è dopo
Per assegnazioni condizionali su una riga, l'Operatore Ternario è spesso più leggibile di un if/else completo.