Sejauh ini seluruh program kita berjalan lurus: statement dieksekusi satu per satu dari atas ke bawah tanpa kecuali. Program yang berguna harus dapat mengambil keputusan — memproses transaksi bila saldo cukup, menolak input yang tidak sah, atau memilih tarif berdasarkan umur. Struktur if adalah alat pengambilan keputusan paling dasar di Java: program mengevaluasi sebuah kondisi bertipe boolean, lalu menjalankan blok kode hanya bila kondisi tersebut bernilai true. Chapter ini membahas bentuk dasar if, rantai else if/else, penggabungan beberapa syarat dengan operator logika, serta satu jebakan klasik ketika kurung kurawal dilupakan.

Bentuk Dasar if #

Bentuk paling sederhana dari if adalah kata kunci if diikuti kondisi dalam tanda kurung dan satu blok dalam kurung kurawal:

java Bentuk umum if
if (kondisi) {
    // statement dijalankan hanya bila kondisi == true
}

Mekanismenya berlangsung saat runtime: JVM mengevaluasi ekspresi di dalam tanda kurung sampai tuntas, memastikan hasilnya bertipe boolean, kemudian melompat ke dalam blok bila hasilnya true atau melompati seluruh blok bila hasilnya false. Berbeda dengan bahasa C, Java tidak mengizinkan angka sebagai kondisi — ekspresi if (jumlah) tidak lolos kompilasi; kita wajib menulis perbandingan eksplisit seperti if (jumlah > 0). Aturan ini memaksa keputusan selalu dinyatakan sebagai pertanyaan ya/tidak yang jernih.

Rantai else if dan else #

Satu keputusan sering kali bertingkat: diskon 20% untuk belanja di atas Rp500.000, 10% di atas Rp300.000, 5% di atas Rp100.000, dan tanpa diskon di bawah itu. Rantai else if/else menyusun tingkatan tersebut dan hanya satu cabang yang berjalan — begitu satu kondisi terpenuhi, seluruh cabang berikutnya dilewati:

public class AmbilKeputusan {
    public static void main(String[] args) {
        int totalBelanja = 275000;
        double persenDiskon;

        if (totalBelanja >= 500000) {
            persenDiskon = 0.20;
        } else if (totalBelanja >= 300000) {
            persenDiskon = 0.10;
        } else if (totalBelanja >= 100000) {
            persenDiskon = 0.05;
        } else {
            persenDiskon = 0.0;
        }

        double potongan = totalBelanja * persenDiskon;

        System.out.println("Total belanja : Rp" + totalBelanja);
        System.out.println("Persen diskon : " + (persenDiskon * 100) + "%");
        System.out.println("Potongan      : Rp" + (int) potongan);
        System.out.println("Total bayar   : Rp" + (int) (totalBelanja - potongan));
    }
}

Output yang Dihasilkan:

text
Total belanja : Rp275000
Persen diskon : 5.0%
Potongan      : Rp13750
Total bayar   : Rp261250

Mari kita bedah cabang yang dipilih oleh program:

  1. Baris 6 (if (totalBelanja >= 500000)): kondisi pertama diuji — 275000 >= 500000 bernilai false, sehingga JVM melompat ke cabang berikutnya.
  2. Baris 8 (else if (totalBelanja >= 300000)): kondisi kedua juga false (275000 >= 300000 gagal), cabang ketiga diuji.
  3. Baris 10 (else if (totalBelanja >= 100000)): 275000 >= 100000 bernilai true — persenDiskon diisi 0.05, lalu seluruh cabang sisanya dilewati. Urutan pengujian dari batas tertinggi ke terendah penting: bila kita menulis syarat >= 100000 paling depan, belanja Rp275.000 akan berhenti di diskon 5% dan tidak pernah mencapai tingkat yang seharusnya.
  4. Baris 12 (else): cabang penampung terakhir yang berjalan bila semua kondisi gagal — di eksekusi ini cabang tersebut tidak dijalankan.

Menggabungkan Beberapa Syarat #

Seleksi beasiswa pada contoh berikut butuh dua syarat sekaligus: nilai ujian minimal 80 dan kehadiran minimal 10 pertemuan. Kondisi boolean dapat disimpan ke variabel terlebih dahulu sehingga rantai if terbaca seperti kalimat, dan operator logika &&, ||, serta ! (yang sudah kita bahas pada Section Operator) merangkai syarat-syarat itu:

public class CekKelayakan {
    public static void main(String[] args) {
        String nama = "Siti";
        int nilaiUjian = 86;
        int kehadiran = 12;   // dari 14 pertemuan

        boolean nilaiCukup = nilaiUjian >= 80;
        boolean hadirCukup = kehadiran >= 10;

        System.out.println("Calon        : " + nama);
        System.out.println("Nilai ujian  : " + nilaiUjian);
        System.out.println("Kehadiran    : " + kehadiran + " pertemuan");

        if (nilaiCukup && hadirCukup) {
            System.out.println(nama + " lolos seleksi beasiswa.");
        } else if (!nilaiCukup) {
            System.out.println("Nilai ujian belum mencapai batas 80.");
        } else {
            System.out.println("Kehadiran kurang dari 10 pertemuan.");
        }

        // if tanpa else: blok hanya berjalan saat syarat terpenuhi
        if (nilaiUjian >= 85) {
            System.out.println("Catatan: nilai memenuhi jalur prestasi.");
        }
    }
}

Output yang Dihasilkan:

text
Calon        : Siti
Nilai ujian  : 86
Kehadiran    : 12 pertemuan
Siti lolos seleksi beasiswa.
Catatan: nilai memenuhi jalur prestasi.

Dua pola kecil di contoh ini layak dicermati. Pertama, if tanpa else sepenuhnya sah — blok catatan jalur prestasi berjalan hanya bila nilai minimal 85, dan diam total bila tidak. Kedua, urutan rantai menentukan pesan yang muncul: cabang else if (!nilaiCukup) hanya tercapai bila syarat gabungan && gagal sementara nilai memang kurang, sehingga pesan penyebabnya tepat. Karena && bersifat short-circuit, evaluasi hadirCukup bahkan tidak dilakukan bila nilaiCukup sudah false.

Saat Kurung Kurawal Dihilangkan #

Java mengizinkan if tanpa kurung kurawal — tepat satu statement berikutnya milik if tersebut. Kenyamanan ini menyimpan kebingungan begitu if bersarang, karena cabang else selalu terikat ke if terdekat, bukan ke if yang terlihat sejajar menurut indentasi:

public class TanpaKurawal {
    public static void main(String[] args) {
        int nilai = 75;

        // Tanpa kurung kurawal, else terikat ke if TERDEKAT (if dalam),
        // bukan ke if pertama seperti yang terlihat dari indentasi.
        if (nilai >= 60)
            if (nilai >= 90)
                System.out.println("Predikat A");
            else
                System.out.println("Predikat B atau C");
        else
            System.out.println("Belum lulus");
    }
}

Output yang Dihasilkan:

text
Predikat B atau C

Nilai 75 membuat if luar bernilai true (melewati 60), lalu if dalam bernilai false (belum 90), sehingga else milik if dalam yang berjalan — hasilnya “Predikat B atau C”. Indentasi menipu mata: else tampak milik if luar, padahal compiler javac mengikat else ke if terdekat tanpa peduli spasi.

Kita kini dapat mengarahkan alur program lewat kondisi boolean. Namun keputusan nyata sering bertingkat — syarat di dalam syarat — dan menumpuknya sebagai rantai panjang tidak selalu cukup. Chapter berikutnya menyusun if bersarang (nested if) beserta teknik meratakan kembali struktur bertingkat itu agar kode tetap ringkas dibaca.

Referensi #

Berkas Sumber

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

AmbilKeputusan.java

Unduh berkas
java
public class AmbilKeputusan {
    public static void main(String[] args) {
        int totalBelanja = 275000;
        double persenDiskon;

        if (totalBelanja >= 500000) {
            persenDiskon = 0.20;
        } else if (totalBelanja >= 300000) {
            persenDiskon = 0.10;
        } else if (totalBelanja >= 100000) {
            persenDiskon = 0.05;
        } else {
            persenDiskon = 0.0;
        }

        double potongan = totalBelanja * persenDiskon;

        System.out.println("Total belanja : Rp" + totalBelanja);
        System.out.println("Persen diskon : " + (persenDiskon * 100) + "%");
        System.out.println("Potongan      : Rp" + (int) potongan);
        System.out.println("Total bayar   : Rp" + (int) (totalBelanja - potongan));
    }
}

CekKelayakan.java

Unduh berkas
java
public class CekKelayakan {
    public static void main(String[] args) {
        String nama = "Siti";
        int nilaiUjian = 86;
        int kehadiran = 12;   // dari 14 pertemuan

        boolean nilaiCukup = nilaiUjian >= 80;
        boolean hadirCukup = kehadiran >= 10;

        System.out.println("Calon        : " + nama);
        System.out.println("Nilai ujian  : " + nilaiUjian);
        System.out.println("Kehadiran    : " + kehadiran + " pertemuan");

        if (nilaiCukup && hadirCukup) {
            System.out.println(nama + " lolos seleksi beasiswa.");
        } else if (!nilaiCukup) {
            System.out.println("Nilai ujian belum mencapai batas 80.");
        } else {
            System.out.println("Kehadiran kurang dari 10 pertemuan.");
        }

        // if tanpa else: blok hanya berjalan saat syarat terpenuhi
        if (nilaiUjian >= 85) {
            System.out.println("Catatan: nilai memenuhi jalur prestasi.");
        }
    }
}

TanpaKurawal.java

Unduh berkas
java
public class TanpaKurawal {
    public static void main(String[] args) {
        int nilai = 75;

        // Tanpa kurung kurawal, else terikat ke if TERDEKAT (if dalam),
        // bukan ke if pertama seperti yang terlihat dari indentasi.
        if (nilai >= 60)
            if (nilai >= 90)
                System.out.println("Predikat A");
            else
                System.out.println("Predikat B atau C");
        else
            System.out.println("Belum lulus");
    }
}