If/Else If/Else
Uneori avem nevoie de mai mult de două ramuri. Imaginează-ți o rachetă care decolează de la sol. În funcție de câte secunde au rămas, vrem să facem lucruri diferite
Dacă mai avem 100 de secunde → pornim calculatoarele de la bord
Dacă mai avem 60 de secunde → verificăm conexiunea cu turnul de control
Dacă mai avem 20 de secunde → pornim motoarele secundare
Dacă mai avem 10 secunde → pornim motoarele principale
Altfel → nu facem nimic special
În Java folosim else if: două cuvinte, scrise pe larg
public class Main {
public static void main(String[] args) {
int secunde = 100;
if (secunde == 100) {
System.out.println("Pornesc toate calculatoarele de la bord");
} else if (secunde == 60) {
System.out.println("Verific conexiunea cu turnul de control");
} else if (secunde == 20) {
System.out.println("Pornesc motoarele secundare");
} else if (secunde == 10) {
System.out.println("Pornesc motoarele principale");
} else {
System.out.println(secunde + " secunde nu au niciun efect");
}
}
}
Rulează asta. Apoi schimbă secunde la 60, 20, 10, 9, 42. Vezi cum se schimbă rezultatul
Lanțul rulează de sus în jos. La prima condiție care este adevărată, Java intră în acel bloc, îl rulează și iese din întregul lanț. Ramurile rămase nu sunt niciodată verificate. Asta este important: dacă secunde == 60, lanțul afișează "Verific conexiunea..." și apoi iese
De ce să nu scriem pur și simplu o grămadă de if-uri separate? Așa
public class Main {
public static void main(String[] args) {
int secunde = 60;
if (secunde == 100) { System.out.println("100"); }
if (secunde == 60) { System.out.println("60"); }
if (secunde == 20) { System.out.println("20"); }
else { System.out.println("altceva"); }
}
}
Problema: fiecare if este independent. else-ul de la final aparține doar ultimului if. Așadar pentru secunde = 60, al treilea if eșuează (60 != 20), iar else-ul intră în acțiune afișând "60 de secunde nu au niciun efect", ceea ce e greșit, am tratat deja 60 mai sus!
Regulă practică: când testăm aceeași variabilă pentru mai multe valori, înlănțuim cu if / else if / else
Putem de asemenea imbrica if-uri unul în altul
public class Main {
public static void main(String[] args) {
int secunde = 5;
boolean eroareDetectata = false;
if (secunde < 10) {
if (eroareDetectata) {
System.out.println("Eroare detectata. Anulez misiunea");
} else {
System.out.println("Nicio eroare detectata. Decolez...");
}
}
}
}
Aici, doar dacă suntem în ultimele 10 secunde, verificăm indicatorul de eroare. if-urile imbricate sunt în regulă, dar dacă imbrici pe 5 niveluri adâncime, codul devine ilizibil. Încearcă să păstrezi lucrurile plate când poți
Misiune: Secvența de Lansare
Cronometrul de numărătoare inversă rulează. În funcție de câte secunde rămân până la lansare, sistemul execută o acțiune diferită:
- la 100 de secunde → afișează
Pornesc toate calculatoarele de la bord - la 60 de secunde → afișează
Verific conexiunea cu turnul de control - la 20 de secunde → afișează
Pornesc motoarele secundare - la 10 secunde → afișează
Pornesc motoarele principale - în orice alt caz → afișează
Astept...
Reține numărul de secunde într-o variabilă int numită secunde și scrie un lanț if / else if / else care afișează acțiunea corectă.
Exemple
La 100 de secunde:
Pornesc toate calculatoarele de la bord
La 60 de secunde:
Verific conexiunea cu turnul de control
La 200 de secunde (nicio ramură nu se potrivește, intră else):
Astept...