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:

java Bentuk umum while
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:

java NolIterasi.java
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:

text
-- while, kondisi awal false --
Loop dilewati, stok = 0
-- while, kondisi awal true --
Memproses stok: 3
Memproses stok: 2
Memproses stok: 1
Selesai, stok = 0

Pada 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:

text
Masukkan bilangan (akhiri dengan -1):
Ditambahkan 12, total = 12
Ditambahkan 7, total = 19
Ditambahkan 30, total = 49
Selesai. Total = 49

Program di atas dijalankan dengan masukan tetap 12, 7, 30, lalu -1. Mari kita bedah alur pembacaannya:

  1. Baris 10 (int bilangan = input.nextInt();): pembacaan pertama sebelum loop — tanpa baris ini, kondisi bilangan != -1 tidak punya nilai untuk diuji. Nilai yang terbaca adalah 12.
  2. Baris 12-15 (badan loop): 12 bukan sentinel, jadi total naik menjadi 12, lalu pembacaan di ujung badan mengambil 7; iterasi berikutnya mengambil 30, dan seterusnya.
  3. Baris 15 (bilangan = input.nextInt();): pembacaan kedua inilah “mesin kemajuan” loop — kelupaan baris ini membuat bilangan berhenti berubah dan loop tidak pernah berakhir.
  4. Iterasi keempat: nextInt() mengembalikan -1; kondisi bilangan != -1 bernilai false, loop berhenti, dan total akhir 49 dicetak. Nilai -1 sendiri 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:

java HitungDigit.java
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:

text
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 #

Berkas Sumber

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

HitungDigit.java

Unduh berkas
java
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.");
    }
}

JumlahSentinel.java

Unduh berkas
java
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);
    }
}

NolIterasi.java

Unduh berkas
java
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);
    }
}