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:
| Jenis | Pemicu | Kapan dipakai |
|---|---|---|
| Line breakpoint | Eksekusi mencapai baris tertentu | Kasus umum, kita tahu baris yang ingin diperiksa |
| Conditional breakpoint | Baris tercapai DAN kondisi terpenuhi | Loop besar; hanya iterasi tertentu yang ingin dihentikan |
| Method breakpoint | Method tertentu dipanggil | API eksternal tanpa source; melacak pemanggilan method |
| Field watchpoint | Field dibaca atau diubah | State 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.
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:
=== 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 BudiLine 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 #
- IntelliJ IDEA Debugging — panduan resmi breakpoint dan watchpoint di IntelliJ IDEA
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.