Line breakpoint adalah jenis breakpoint paling umum, tetapi tidak selalu cukup. Kadang kita hanya ingin menjeda saat sebuah method tertentu dipanggil, atau saat sebuah field berubah nilainya, atau hanya saat kondisi tertentu terpenuhi. IntelliJ menyediakan beberapa jenis breakpoint untuk skenario tersebut. Pada chapter ini kita akan membedah empat jenis breakpoint utama dan kapan masing-masing paling efektif digunakan. Kode contoh akan menjelaskan skenario yang dapat kita gunakan sebagai bahan latihan memasang breakpoint.

Empat Jenis Breakpoint #

Berikut ringkasan jenis breakpoint yang tersedia di IntelliJ:

JenisPemicuKapan dipakai
Line breakpointEksekusi mencapai baris tertentuKasus umum, kita tahu baris yang ingin diperiksa
Conditional breakpointBaris tercapai DAN kondisi terpenuhiLoop besar; hanya iterasi tertentu yang ingin dihentikan
Method breakpointMethod tertentu dipanggilAPI eksternal tanpa source; melacak pemanggilan method
Field watchpointField dibaca atau diubahState berubah tanpa sebab jelas; menemukan penulis field

Kode Demo Latihan Breakpoint #

Program berikut berisi list angka, sebuah class Rekening dengan field saldo, sebuah iterasi dengan kondisi, dan sebuah method proses. Kita akan memasang berbagai jenis breakpoint pada kode ini.

kotlin
fun main() {
    println("=== Demo Breakpoints dan Watchpoints ===")

    // Data sederhana
    val angka = mutableListOf(10, 25, 7, 30, 15)

    // Line breakpoint akan pause di sini
    val total = jumlahkan(angka)
    println("Total: $total")

    // Field watchpoint akan pause saat field `saldo` berubah
    val rekening = Rekening("Budi", 100_000.0)
    rekening.setor(50_000.0)
    rekening.tarik(25_000.0)
    println("Saldo akhir ${rekening.pemilik}: ${rekening.saldo}")

    // Conditional breakpoint hanya pause saat angka == 30
    println("Iterasi dengan kondisi:")
    for (a in angka) {
        // Set conditional breakpoint: a == 30
        println("  - $a")
    }

    // Method breakpoint: pause saat method proses() dipanggil
    proses("Budi")
}

fun jumlahkan(daftar: List<Int>): Int {
    var total = 0
    for (x in daftar) total += x
    return total
}

class Rekening(val pemilik: String, saldoAwal: Double) {
    var saldo: Double = saldoAwal
        private set

    fun setor(jumlah: Double) {
        saldo += jumlah
        println("[setor] +$jumlah -> saldo $saldo")
    }

    fun tarik(jumlah: Double) {
        if (jumlah > saldo) {
            println("[tarik] Gagal: jumlah melebihi saldo")
            return
        }
        saldo -= jumlah
        println("[tarik] -$jumlah -> saldo $saldo")
    }
}

fun proses(nama: String) {
    println("[proses] Memproses $nama")
}

Output yang Dihasilkan:

text
=== Demo Breakpoints dan Watchpoints ===
Total: 87
[setor] +50000.0 -> saldo 150000.0
[tarik] -25000.0 -> saldo 125000.0
Saldo akhir Budi: 125000.0
Iterasi dengan kondisi:
  - 10
  - 25
  - 7
  - 30
  - 15
[proses] Memproses Budi

Line dan Conditional Breakpoint #

Line breakpoint dipasang dengan mengklik gutter di samping nomor baris. Untuk conditional breakpoint, klik kanan pada ikon breakpoint dan isi field Condition dengan ekspresi Kotlin yang menghasilkan boolean, misalnya a == 30 atau saldo > 100_000. Saat eksekusi mencapai baris tersebut, IntelliJ hanya menjeda bila kondisi bernilai true.

Method Breakpoint #

Method breakpoint dipasang dengan mengklik gutter di samping deklarasi method (bukan di pemanggil). Debugger akan menjeda setiap kali method tersebut dipanggil, terlepas dari pemanggil. Hal ini berguna untuk memantau API eksternal yang tidak memiliki source code: kita bisa memasang breakpoint pada method interface dan melacak implementasi mana yang dipanggil pada runtime.

Field Watchpoint #

Field watchpoint dipasang pada deklarasi field. Pada kode demo, kita bisa memasang watchpoint pada var saldo di class Rekening. Dengan opsi Field access dan Field modification, debugger akan menjeda saat field dibaca atau ditulis. Hal ini sangat berguna saat kita melihat field berubah tanpa sebab jelas — watchpoint langsung menunjukkan method mana yang mengubah nilainya.

Referensi Lanjutan #

Penutup #

Pemilihan jenis breakpoint yang tepat mempercepat investigasi. Line dan conditional breakpoint cukup untuk sebagian besar kasus; method dan field watchpoint digunakan untuk masalah yang lebih sulit terutama yang melibatkan API eksternal atau perubahan state yang sulit ditelusuri. Berikutnya kita akan menelusuri step-by-step eksekusi dengan Step Over, Step Into, Step Out, dan Drop Frame.