Loop for unggul saat jumlah pengulangan sudah terbayang sejak awal, namun banyak proses justru berjalan tanpa tahu kapan berhenti: terus membaca data selama pengguna masih memasukkan bilangan, terus memproses selama saldo masih tersisa, terus membagi selama hasilnya belum nol. Untuk pola “selama masih …”, Java menyediakan while — perulangan yang badannya berjalan selama kondisi bernilai true, dengan jumlah iterasi yang sama sekali tidak perlu diketahui di muka. Chapter ini membahas semantik uji-kondisi-di-awal, pola sentinel untuk membaca input pengguna, pola penghitungan yang menyusut, serta cara mengenali dan mencegah perulangan tak berujung.
Uji Kondisi di Awal #
Bentuk while hanya memiliki dua bagian — kondisi dan badan:
while (kondisi) {
// badan loop, berjalan selama kondisi == true
}JVM mengevaluasi kondisi sebelum setiap iterasi. Bila hasilnya false sejak pengujian pertama, badan loop tidak pernah dijalankan sama sekali — sifat zero-iteration ini sering dijadikan fitur, misalnya daftar kosong yang memang tidak perlu diproses. Program berikut memperagakan kedua sisinya:
public class NolIterasi {
public static void main(String[] args) {
int stok = 0;
System.out.println("-- while, kondisi awal false --");
while (stok > 0) {
System.out.println("Memproses stok: " + stok);
stok--;
}
System.out.println("Loop dilewati, stok = " + stok);
System.out.println("-- while, kondisi awal true --");
stok = 3;
while (stok > 0) {
System.out.println("Memproses stok: " + stok);
stok--;
}
System.out.println("Selesai, stok = " + stok);
}
}Output yang Dihasilkan:
-- while, kondisi awal false --
Loop dilewati, stok = 0
-- while, kondisi awal true --
Memproses stok: 3
Memproses stok: 2
Memproses stok: 1
Selesai, stok = 0Pada bagian pertama, stok bernilai 0 sehingga stok > 0 langsung false: satu baris keluaran pemberitahuan muncul dan loop terlewati tanpa satu iterasi. Pada bagian kedua, stok diisi ulang menjadi 3; kondisi lolos tiga kali (mencetak 3, 2, 1) dan berhenti ketika stok mencapai 0. Perhatikan pula bahwa variabel stok diperiksa sebelum dikurangi — nilai 0 penanda berhenti tidak pernah diproses oleh badan loop.
Pola Sentinel dengan Scanner #
Pola paling produktif dari while adalah membaca input sampai pengguna memasukkan nilai penanda berhenti (sentinel value). Struktur bacakannya khas dan wajib dikenali: satu pembacaan sebelum loop untuk mengisi kondisi pertama, lalu satu pembacaan di ujung badan untuk maju ke data berikutnya:
import java.util.Scanner;
public class JumlahSentinel {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int total = 0;
System.out.println("Masukkan bilangan (akhiri dengan -1):");
int bilangan = input.nextInt(); // baca sebelum loop
while (bilangan != -1) { // -1 = nilai sentinel
total += bilangan;
System.out.println("Ditambahkan " + bilangan + ", total = " + total);
bilangan = input.nextInt(); // baca nilai berikutnya
}
input.close();
System.out.println("Selesai. Total = " + total);
}
}Output yang Dihasilkan:
Masukkan bilangan (akhiri dengan -1):
Ditambahkan 12, total = 12
Ditambahkan 7, total = 19
Ditambahkan 30, total = 49
Selesai. Total = 49Program di atas dijalankan dengan masukan tetap 12, 7, 30, lalu -1. Mari kita bedah alur pembacaannya:
- Baris 10 (
int bilangan = input.nextInt();): pembacaan pertama sebelum loop — tanpa baris ini, kondisibilangan != -1tidak punya nilai untuk diuji. Nilai yang terbaca adalah12. - Baris 12-15 (badan loop):
12bukan sentinel, jadi total naik menjadi12, lalu pembacaan di ujung badan mengambil7; iterasi berikutnya mengambil30, dan seterusnya. - Baris 15 (
bilangan = input.nextInt();): pembacaan kedua inilah “mesin kemajuan” loop — kelupaan baris ini membuatbilanganberhenti berubah dan loop tidak pernah berakhir. - Iterasi keempat:
nextInt()mengembalikan-1; kondisibilangan != -1bernilaifalse, loop berhenti, dan total akhir49dicetak. Nilai-1sendiri tidak pernah masuk ke akumulator.
while untuk Penghitungan yang Menyusut #
Pola ketiga: badan loop mengikis variabel kondisinya sendiri hingga kondisi mustahil terpenuhi lagi. Menghitung banyak digit sebuah bilangan bulat cukup membuang digit terakhir berulang kali:
public class HitungDigit {
public static void main(String[] args) {
int bilangan = 987654;
int sisa = bilangan;
int banyakDigit = 0;
while (sisa != 0) {
sisa = sisa / 10; // buang satu digit terakhir
banyakDigit++;
}
System.out.println(bilangan + " memiliki " + banyakDigit + " digit.");
}
}Output yang Dihasilkan:
987654 memiliki 6 digit.Enam iterasi mengikis 987654 menjadi 98765, 9876, 987, 98, 9, lalu 0 — setiap iterasi menambah banyakDigit satu, berakhir dengan jawaban 6. Struktur ini menjelaskan kapan while lebih pas daripada for: variabel kondisi sisa tidak bergerak satu-satu dari nilai awal ke nilai akhir yang diketahui, melainkan menyusut mengikuti ukuran datanya sendiri; kita memang tidak tahu di muka berapa iterasi yang dibutuhkan bilangan 987654.
Bahaya Perulangan Tak Berujung #
Dengan while, alur program dapat berputar selama kondisi bernilai true — dan diam total bila kondisi sejak awal false. Ada kalanya kebutuhannya terbalik: badan loop harus berjalan sekali dulu, apa pun kondisinya, barulah pengujian mengambil alih — misalnya menu yang tampil minimal satu kali atau validasi input yang pertama kali harus dibaca lebih dulu. Chapter berikutnya membahas do-while, anggota keluarga loop yang menguji kondisi setelah badan berjalan.
Referensi #
- JLS SE25 §14.12: The while Statement
- Oracle Tutorial: The while and do-while Statements
- Java SE25 API: java.util.Scanner
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
HitungDigit.java
Unduh berkaspublic class HitungDigit {
public static void main(String[] args) {
int bilangan = 987654;
int sisa = bilangan;
int banyakDigit = 0;
while (sisa != 0) {
sisa = sisa / 10; // buang satu digit terakhir
banyakDigit++;
}
System.out.println(bilangan + " memiliki " + banyakDigit + " digit.");
}
}
JumlahSentinel.java
Unduh berkasimport java.util.Scanner;
public class JumlahSentinel {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int total = 0;
System.out.println("Masukkan bilangan (akhiri dengan -1):");
int bilangan = input.nextInt(); // baca sebelum loop
while (bilangan != -1) { // -1 = nilai sentinel
total += bilangan;
System.out.println("Ditambahkan " + bilangan + ", total = " + total);
bilangan = input.nextInt(); // baca nilai berikutnya
}
input.close();
System.out.println("Selesai. Total = " + total);
}
}
NolIterasi.java
Unduh berkaspublic class NolIterasi {
public static void main(String[] args) {
int stok = 0;
System.out.println("-- while, kondisi awal false --");
while (stok > 0) {
System.out.println("Memproses stok: " + stok);
stok--;
}
System.out.println("Loop dilewati, stok = " + stok);
System.out.println("-- while, kondisi awal true --");
stok = 3;
while (stok > 0) {
System.out.println("Memproses stok: " + stok);
stok--;
}
System.out.println("Selesai, stok = " + stok);
}
}