break și continue în Java

break oprește bucla (sau switch-ul) curentă; continue sare peste restul pasului curent; cu etichete acționează asupra unei bucle exterioare.

Sintaxă
break;              // iese din buclă (sau din switch)
continue;           // trece la pasul următor
exterior:
for (...) {
    for (...) {
        break exterior;  // iese din ambele bucle
    }
}

Ce face break și continue

break oprește imediat bucla în care se află (for, while, do) sau iese dintr-un switch în forma veche. Execuția continuă cu prima instrucțiune de după buclă.

continue sare peste restul codului din pasul curent și trece la pasul următor: în for se execută pasul (i++), apoi se verifică din nou condiția.

În bucle imbricate, break și continue simple acționează doar asupra buclei interioare. Cu o etichetă (un nume urmat de : pus înaintea buclei exterioare), break eticheta; iese din bucla exterioară. Java nu are goto (cuvântul este rezervat, dar nu se folosește), iar etichetele sunt înlocuitorul controlat.

Exemple

Exemplul 1: Căutare cu break

Bucla se oprește la primul produs prea scump; restul nu mai sunt verificate.

public class Main {
    public static void main(String[] args) {
        String[] produse = {"pâine", "lapte", "cafea", "ciocolată"};
        double[] preturi = {4.5, 7.2, 32.0, 8.9};
        double buget = 20;
        for (int i = 0; i < produse.length; i++) {
            if (preturi[i] > buget) {
                System.out.println("Stop: " + produse[i] + " costă " + preturi[i] + " lei");
                break;
            }
            buget -= preturi[i];
            System.out.println("Cumpăr " + produse[i] + ", rămân " + buget + " lei");
        }
    }
}

Rezultat

Cumpăr pâine, rămân 15.5 lei
Cumpăr lapte, rămân 8.3 lei
Stop: cafea costă 32.0 lei

Exemplul 2: Sărirea elementelor cu continue

Notele lipsă (0) sunt sărite cu continue și nu intră în medie.

public class Main {
    public static void main(String[] args) {
        int[] note = {9, 0, 8, 10, 0, 7};
        int suma = 0, numar = 0;
        for (int nota : note) {
            if (nota == 0) {
                continue; // notă lipsă
            }
            suma += nota;
            numar++;
        }
        System.out.println(numar + " note, media " + (double) suma / numar);
    }
}

Rezultat

4 note, media 8.5

Exemplul 3: Etichetă pentru bucle imbricate

break cautare iese din ambele bucle când găsește primul loc liber. Fără etichetă, ar ieși doar din bucla interioară și ar continua cu rândul următor.

public class Main {
    public static void main(String[] args) {
        boolean[][] ocupat = {
            {true, true, true},
            {true, false, true},
            {false, false, false},
        };
        int rand = -1, loc = -1;
        cautare:
        for (int r = 0; r < ocupat.length; r++) {
            for (int l = 0; l < ocupat[r].length; l++) {
                if (!ocupat[r][l]) {
                    rand = r + 1;
                    loc = l + 1;
                    break cautare;
                }
            }
        }
        System.out.println("Primul loc liber: rândul " + rand + ", locul " + loc);
    }
}

Rezultat

Primul loc liber: rândul 2, locul 2

Greșeli frecvente

  • break într-o buclă interioară, cu speranța că iese din toate buclele: folosește o etichetă sau mută codul într-o metodă cu return.
  • continue într-un while înainte de actualizarea contorului: contorul nu mai crește și bucla devine infinită.
  • break sau continue în afara unei bucle (de exemplu într-o lambda din forEach): nu compilează.

Comenzi înrudite

  • for: Bucla clasică cu contor: inițializare, condiție verificată înaintea fiecărui pas și actualizare după fiecare pas.
  • while și do-while: while repetă un bloc cât timp condiția este adevărată; do-while execută blocul o dată și abia apoi verifică condiția.
  • switch, case și default: Alege ce cod se execută comparând o valoare cu mai multe constante case; default tratează orice altă valoare.
  • return și void: return încheie metoda și trimite înapoi o valoare; void marchează o metodă care nu returnează nimic.