Pesan error pertama sering terasa seperti tembok teks tanpa titik masuk. Kenyataannya, pesan error javac dan stack trace Java termasuk yang paling informatif: keduanya menyebut lokasi kejadian hingga baris dan kolom, dan cara membacanya selalu tertib. Pada Chapter penutup Section ini, kita bedah anatomi pesan error compiler, anatomi stack trace runtime, dan alur diagnosis yang bisa dipakai berulang kali.
Anatomi Pesan Error javac #
Mari mulai dari kesalahan paling klasik: titik koma yang hilang. Program berikut sah dibaca manusia, tetapi ditolak compiler:
public class KurangTitikKoma {
public static void main(String[] args) {
int umur = 17
System.out.println(umur);
}
}Perintah javac KurangTitikKoma.java membalas dengan pesan berikut:
KurangTitikKoma.java:3: error: ';' expected
int umur = 17
^
1 errorPesan tersebut tersusun dari bagian-bagian yang selalu tetap urutannya:
KurangTitikKoma.java:3: nama berkas dan nomor baris tempat compiler berhenti — titik mulai pencarian kita.error: ';' expected: jenis kesalahan. Compiler membacaint umur = 17, lalu di baris berikutnya bertemuSystemyang tidak mungkin melanjutkan statement — maka compiler menyimpulkan tanda yang diharapkannya: titik koma.- Tanda sisip (
^): kolom perkiraan penyebab — tanda ini menunjuk tepat setelah17, titik tempat compiler menyadari harapannya gagal terpenuhi. 1 error: ringkasan jumlah kesalahan di berkas tersebut.
Pesan cannot find symbol #
Kesalahan paling sering dialami pemula adalah memakai nama yang belum dikenal compiler. Program berikut mencetak variabel yang tidak pernah dideklarasikan:
public class VariabelBelumDeklarasi {
public static void main(String[] args) {
System.out.println(total);
}
}VariabelBelumDeklarasi.java:3: error: cannot find symbol
System.out.println(total);
^
symbol: variable total
location: class VariabelBelumDeklarasi
1 errorPesan cannot find symbol selalu dilengkapi dua baris rincian: symbol menyebut nama yang dicari beserta jenisnya (variable total — bisa juga method atau class), dan location menyebut lingkup pencarian (class VariabelBelumDeklarasi). Cara membacanya: compiler mencari total di dalam class ini dan tidak menemukannya — kemungkinan nama salah ketik, variabel belum dideklarasi, atau deklarasi berada di luar jangkauan.
Anatomi Stack Trace #
Saat kesalahan terjadi di runtime, JVM berbicara dalam format lain: stack trace — potret jenis exception, pesannya, dan jalur pemanggilan method saat kejadian. Program berikut sengaja mengakses indeks di luar ukuran array:
public class AksesArray {
public static void main(String[] args) {
int[] nilai = {70, 85, 90};
System.out.println("Mengakses indeks 5...");
System.out.println(nilai[5]);
}
}Program tersebut memang sengaja berakhir dengan error; eksekusi nyatanya menghasilkan keluaran berikut:
Mengakses indeks 5...
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3
at AksesArray.main(AksesArray.java:6)Mari kita baca baris demi baris:
Mengakses indeks 5...: baris cetak pertama sempat dijalankan — program berjalan normal sampai titik ini sebelum berhenti.Exception in thread "main": exception terjadi di threadmain, jalur eksekusi utama program.java.lang.ArrayIndexOutOfBoundsException: nama lengkap exception-nya. Namanya sudah bercerita: akses ke index array berada di luar batas.Index 5 out of bounds for length 3: pesan detail — kita meminta indeks5, padahal array hanya berisi3elemen (indeks sah hanya0sampai2).at AksesArray.main(AksesArray.java:6): satu stack frame — kejadian berada di methodmain, berkasAksesArray.java, baris6. Pada program bersarang, frame bertambah: paling atas adalah titik kejadian, di bawahnya rantai pemanggil yang membawa eksekusi ke sana.
Menangkap Exception untuk Pesan Ringkas #
Kita juga dapat menangkap exception tanpa menghentikan program: bungkus kode berisiko dalam blok try lalu tangkap di blok catch:
public class AksesAman {
public static void main(String[] args) {
int[] nilai = {70, 85, 90};
try {
System.out.println(nilai[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Terjadi error: " + e.getMessage());
}
System.out.println("Program tetap lanjut ke sini.");
}
}Output yang Dihasilkan:
Terjadi error: Index 5 out of bounds for length 3
Program tetap lanjut ke sini.Method getMessage() mengembalikan bagian pesan exception — persis teks yang kita lihat di stack trace sebelumnya. Baris setelah catch tetap berjalan: exception yang tertangkap tidak lagi menghentikan program. Teknik ini dibedah tuntas pada Section Exception Handling.
Alur Diagnosis yang Tersusun #
Dengan anatomi di atas, diagnosis menjadi prosedur tetap:
- Baca pesan pertama dari atas — pesan berikutnya sering hanyalah efek berantai dari penyebab pertama.
- Buka berkas dan baris yang disebut; jika baris tersebut tampak benar, periksa satu baris di atasnya.
- Sebutkan jenis kesalahannya dengan kata sendiri — “compiler tidak menemukan variabel
total” jauh lebih dapat ditindaklanjuti daripada “program error”. - Rumuskan satu hipotesis perbaikan, terapkan, lalu kompilasi ulang untuk menguji.
- Ulangi sampai bersih — satu perbaikan kerap meredam beberapa pesan sekaligus.
Section Dasar Pemrograman kini tuntas: kita telah menulis dan menjalankan program, membaca struktur kode, memahami class dan main, menulis komentar, membedakan statement dan expression, menamai identifier, dan memetakan jenis kesalahan. Modal berikutnya untuk program yang lebih hidup adalah data: tempat menyimpan nilai, tipe-tipe yang tersedia, dan cara keduanya berinteraksi. Section Variabel dan Tipe Data menyambung persis dari titik ini.
Referensi #
- Oracle: Learning the Java Language
- Class ArrayIndexOutOfBoundsException pada API java.lang
- Oracle JDK 25 Documentation
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
AksesAman.java
Unduh berkaspublic class AksesAman {
public static void main(String[] args) {
int[] nilai = {70, 85, 90};
try {
System.out.println(nilai[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Terjadi error: " + e.getMessage());
}
System.out.println("Program tetap lanjut ke sini.");
}
}
AksesArray.java
Unduh berkaspublic class AksesArray {
public static void main(String[] args) {
int[] nilai = {70, 85, 90};
System.out.println("Mengakses indeks 5...");
System.out.println(nilai[5]);
}
}