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:
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:
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:
- Baris 15 (
pencarian:): label dipasang pada loop luar — milik baris, bukan kolom. - Baris 16-24 (loop luar dan dalam): delapan elemen diperiksa berurutan
[0][0]hingga[2][1]. Pencarian mencapai14tepat di[2][1]. - Baris 21 (
break pencarian;):breakdengan label menghentikan loop berlabel — loop baris — yang otomatis membawa serta loop kolom di dalamnya. Keluaran berhenti diMemeriksa [2][1] = 14; elemen[2][2]tidak pernah disentuh, padahal loop kolom masih punya satu iterasi tersisa. - Bayangkan tanpa label:
breakpolos hanya keluar dari loop kolom; loop baris melanjutkan kebberikutnya dan — karenabsudah di batas terakhir — loop luar baru berakhir setelah header loop luar mengujib < 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:
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:
Baris 0 lengkap, total = 36
Baris 1 dilewati: ada data 0.
Baris 2 lengkap, total = 63Mari 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 #
- JLS SE25 §14.7: Labeled Statements
- JLS SE25 §14.15: The break Statement
- Oracle Tutorial: Branching Statements (labeled forms)
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
CariDiMatriks.java
Unduh berkaspublic 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 berkaspublic 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);
}
}
}