Chapter sebelumnya berakhir pada satu keterbatasan: break dan continue hanya berlaku untuk loop terdalam. Pada loop bersarang — misalnya memindai tabel dua dimensi — kebutuhan yang sering muncul justru “berhenti seluruhnya begitu data ditemukan di mana pun” atau “lewati satu baris penuh yang mengandung elemen bermasalah”. Java menjawabnya dengan label: nama yang dipasang di depan sebuah loop, sehingga break atau continue dapat menyebut loop mana yang hendak dihentikan atau dilanjutkan — satu tingkat, dua tingkat, atau seluruh menara sekaligus. Chapter ini membahas sintaks label, dua contoh terverifikasi pada loop dua dimensi, dan batas sopan santun pemakaiannya.

Memasang Label pada Loop #

Label adalah identifier biasa yang ditulis di depan statement loop, diikuti titik dua:

java Bentuk umum labeled break
namaLabel:
for (...; ...; ...) {
    for (...; ...; ...) {
        if (kondisi) {
            break namaLabel;   // keluar dari loop berlabel, bukan loop terdalam
        }
    }
}

Mekanismenya lugas: break namaLabel menghentikan loop yang membawa label namaLabel — berapa pun tingkat loop di antara statement break dan label tersebut. Bentuk continue namaLabel mirip: iterasi berikutnya dari loop berlabel itu pula yang dijalankan, melewati sisa iterasi loop-loop di antaranya. Label hanya boleh dipasang pada loop (dan blok switch); label di Java bukanlah goto bebas — target lompatannya terikat struktur perulangan, dan compiler menolak break/continue yang menyebut label tidak dikenal.

Labeled break untuk Keluar Dua Tingkat #

Contoh pertama: mencari nilai 14 pada matriks tiga kali tiga dan berhenti begitu nilai tersebut ditemukan. Variabel int[][] data adalah array dua dimensi — array yang elemennya juga array, sehingga data[b][k] menunjuk baris b kolom k:

public class CariDiMatriks {
    public static void main(String[] args) {
        int[][] data = {
            { 3,  7,  1 },
            { 8,  5,  9 },
            { 2, 14,  6 }
        };
        int target = 14;
        int barisKetemu = -1;
        int kolomKetemu = -1;

        pencarian:
        for (int b = 0; b < data.length; b++) {
            for (int k = 0; k < data[b].length; k++) {
                System.out.println("Memeriksa [" + b + "][" + k + "] = " + data[b][k]);
                if (data[b][k] == target) {
                    barisKetemu = b;
                    kolomKetemu = k;
                    break pencarian;   // keluar dari KEDUA loop sekaligus
                }
            }
        }

        System.out.println("Target " + target + " ditemukan di [" + barisKetemu + "][" + kolomKetemu + "]");
    }
}

Output yang Dihasilkan:

text
Memeriksa [0][0] = 3
Memeriksa [0][1] = 7
Memeriksa [0][2] = 1
Memeriksa [1][0] = 8
Memeriksa [1][1] = 5
Memeriksa [1][2] = 9
Memeriksa [2][0] = 2
Memeriksa [2][1] = 14
Target 14 ditemukan di [2][1]

Jejak pemeriksaan menjadi bukti bahwa kedua loop benar-benar berhenti sekaligus:

  1. Baris 15 (pencarian:): label dipasang pada loop luar — milik baris, bukan kolom.
  2. Baris 16-24 (loop luar dan dalam): delapan elemen diperiksa berurutan [0][0] hingga [2][1]. Pencarian mencapai 14 tepat di [2][1].
  3. Baris 21 (break pencarian;): break dengan label menghentikan loop berlabel — loop baris — yang otomatis membawa serta loop kolom di dalamnya. Keluaran berhenti di Memeriksa [2][1] = 14; elemen [2][2] tidak pernah disentuh, padahal loop kolom masih punya satu iterasi tersisa.
  4. Bayangkan tanpa label: break polos hanya keluar dari loop kolom; loop baris melanjutkan ke b berikutnya dan — karena b sudah di batas terakhir — loop luar baru berakhir setelah header loop luar menguji b < data.length. Pada matriks lebih besar, perbedaannya bukan sekadar dua elemen sisanya, melainkan seluruh baris-baris yang tersisa.

Labeled continue untuk Melompat Satu Baris Penuh #

continue berlabel menyelesaikan kebutuhan sebaliknya: jangan hentikan pencarian, cukup lompati iterasi loop luar yang bermasalah. Contoh berikut menjumlahkan setiap baris data penjualan, namun baris yang mengandung angka 0 (penanda data tidak lengkap) dilewati seluruhnya:

java LewatiBaris.java
public class LewatiBaris {
    public static void main(String[] args) {
        int[][] data = {
            { 12, 15,  9 },
            {  7,  0,  4 },   // mengandung 0: data tidak lengkap
            { 20, 25, 18 }
        };

        barisBerikutnya:
        for (int b = 0; b < data.length; b++) {
            for (int k = 0; k < data[b].length; k++) {
                if (data[b][k] == 0) {
                    System.out.println("Baris " + b + " dilewati: ada data 0.");
                    continue barisBerikutnya;   // lompat ke baris berikutnya
                }
            }
            int total = data[b][0] + data[b][1] + data[b][2];
            System.out.println("Baris " + b + " lengkap, total = " + total);
        }
    }
}

Output yang Dihasilkan:

text
Baris 0 lengkap, total = 36
Baris 1 dilewati: ada data 0.
Baris 2 lengkap, total = 63

Mari kita ikuti alurnya pada baris bermasalah: saat b bernilai 1, loop kolom menemukan data[1][1] == 0; continue barisBerikutnya membatalkan sisa iterasi loop kolom sekaligus sisa badan loop baris — statement penjumlahan total untuk baris 1 tidak dieksekusi — lalu eksekusi melompat ke update b++ milik loop berlabel dan menguji kondisi baris berikutnya. Baris 2 diproses normal dengan total 63. Tanpa label, continue polos hanya melompati kolom 1 (si angka 0), penjumlahan tetap berjalan dengan data yang salah, dan baris bermasalah lolos sebagai 11 — kesalahan senyap yang jauh lebih mahal daripada error yang terlihat.

Kapan Label Layak Dipakai #

Label adalah alat khusus untuk kebutuhan khusus. Sebelum menulisnya, pertimbangkan dua alternatif yang sering menghasilkan kode lebih mudah dirawat. Pertama, pindahkan loop ke dalam method tersendiri: statement return mengakhiri seluruh pencarian tanpa perlu label, dan nama method (misalnya cariTarget(data, target)) mendokumentasikan maksudnya. Kedua, variabel boolean penanda — misalnya ketemu yang diuji pada kondisi kedua loop — menghentikan pencarian secara bertahap, meski membaca alurnya perlu ekstra teliti.

Dengan label, kendali kita atas loop bersarang kini lengkap: masuk, keluar satu tingkat, keluar sekaligus, dan melompati satu lapis penuh. Loop bersarang itu sendiri masih menyimpan satu tingkat lagi keahlian — menyusun pola dua dimensi seperti tabel perkalian dan bangun segitiga bintang, tempat hubungan antar-indeks menjadi inti logika. Chapter berikutnya berlatih membentuk pola-pola itu.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

CariDiMatriks.java

Unduh berkas
java
public class CariDiMatriks {
    public static void main(String[] args) {
        int[][] data = {
            { 3,  7,  1 },
            { 8,  5,  9 },
            { 2, 14,  6 }
        };
        int target = 14;
        int barisKetemu = -1;
        int kolomKetemu = -1;

        pencarian:
        for (int b = 0; b < data.length; b++) {
            for (int k = 0; k < data[b].length; k++) {
                System.out.println("Memeriksa [" + b + "][" + k + "] = " + data[b][k]);
                if (data[b][k] == target) {
                    barisKetemu = b;
                    kolomKetemu = k;
                    break pencarian;   // keluar dari KEDUA loop sekaligus
                }
            }
        }

        System.out.println("Target " + target + " ditemukan di [" + barisKetemu + "][" + kolomKetemu + "]");
    }
}

LewatiBaris.java

Unduh berkas
java
public class LewatiBaris {
    public static void main(String[] args) {
        int[][] data = {
            { 12, 15,  9 },
            {  7,  0,  4 },   // mengandung 0: data tidak lengkap
            { 20, 25, 18 }
        };

        barisBerikutnya:
        for (int b = 0; b < data.length; b++) {
            for (int k = 0; k < data[b].length; k++) {
                if (data[b][k] == 0) {
                    System.out.println("Baris " + b + " dilewati: ada data 0.");
                    continue barisBerikutnya;   // lompat ke baris berikutnya
                }
            }
            int total = data[b][0] + data[b][1] + data[b][2];
            System.out.println("Baris " + b + " lengkap, total = " + total);
        }
    }
}