while și do-while în Java

while repetă un bloc cât timp condiția este adevărată; do-while execută blocul o dată și abia apoi verifică condiția.

Sintaxă
while (conditie) {
    // se repetă cât timp conditie e true
}

do {
    // se execută cel puțin o dată
} while (conditie);

Ce face while și do-while

while verifică condiția înaintea fiecărei iterații. Dacă este falsă de la început, blocul nu se execută deloc. Se folosește când nu știi dinainte câți pași vor fi: citești până la finalul datelor, aștepți o condiție, repeți până la o anumită valoare.

do { ... } while (conditie); execută blocul înainte de verificare, deci cel puțin o dată. Este potrivit pentru meniuri și pentru citiri repetate până la o valoare validă. Observă ; de la final.

Corpul buclei trebuie să schimbe ceva din condiție, altfel bucla nu se oprește niciodată. Din orice buclă poți ieși mai devreme cu break.

Exemple

Exemplul 1: Economii până la o țintă

Nu se știe dinainte câte luni sunt necesare, deci while este mai potrivit decât for.

public class Main {
    public static void main(String[] args) {
        double economii = 0;
        double tinta = 5000;
        int luni = 0;
        while (economii < tinta) {
            economii += 450;
            economii *= 1.004; // dobândă lunară
            luni++;
        }
        System.out.printf("După %d luni: %.2f lei%n", luni, economii);

        int n = 0;
        while (n > 0) {
            System.out.println("nu se afișează niciodată");
        }
        System.out.println("while cu condiție falsă de la început: 0 pași");
    }
}

Rezultat

După 11 luni: 5070.40 lei
while cu condiție falsă de la început: 0 pași

Exemplul 2: do-while: citire până la o valoare validă

Programul cere o notă până primește una între 1 și 10. Prima citire are loc înainte de orice verificare, de aceea do-while este natural aici.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int nota;
        do {
            System.out.print("Nota (1-10): ");
            nota = in.nextInt();
            System.out.println(nota);
        } while (nota < 1 || nota > 10);
        System.out.println("Nota acceptată: " + nota);
    }
}

Ce scrie utilizatorul (intrare)

12
-3
9

Rezultat

Nota (1-10): 12
Nota (1-10): -3
Nota (1-10): 9
Nota acceptată: 9

Exemplul 3: Cifrele unui număr

% 10 dă ultima cifră, iar / 10 o elimină. Bucla se oprește când numărul ajunge la 0.

public class Main {
    public static void main(String[] args) {
        int numar = 2026;
        int copie = numar;
        int suma = 0;
        int cifre = 0;
        while (copie > 0) {
            suma += copie % 10;
            copie /= 10;
            cifre++;
        }
        System.out.println(numar + " are " + cifre + " cifre cu suma " + suma);
    }
}

Rezultat

2026 are 4 cifre cu suma 10

Greșeli frecvente

  • Bucla infinită: uiți să schimbi variabila din condiție (luni++ lipsă).
  • while (conditie); cu punct și virgulă după paranteză: bucla are corpul gol și, dacă condiția e adevărată, nu se oprește.
  • Uitarea lui ; după while (...) la do-while: nu compilează.

Comenzi înrudite

  • for: Bucla clasică cu contor: inițializare, condiție verificată înaintea fiecărui pas și actualizare după fiecare pas.
  • break și continue: break oprește bucla (sau switch-ul) curentă; continue sare peste restul pasului curent; cu etichete acționează asupra unei bucle exterioare.
  • boolean: Tipul pentru valori logice: true sau false. Condițiile din if, while și for trebuie să fie boolean.