Momen menulis program pertama adalah langkah penting dari teori menuju praktik. Pada Chapter ini kita akan menulis program Halo, Dunia! dari nol, mengompilasinya dengan javac, lalu menjalankannya dengan java. Kita juga akan mencoba jalur pintas untuk berkas sumber tunggal serta mengenali kendala yang paling sering muncul pada percobaan pertama. Setelah menyelesaikan chapter ini, kita memiliki siklus kerja lengkap: menulis kode, mengompilasi, dan menjalankannya.

Program Halo Dunia #

Tradisi pemrograman dimulai dari program paling kecil yang berhasil berjalan. Buat berkas baru bernama HaloDunia.java di editor atau IDE favorit, lalu tulis kode berikut:

java HaloDunia.java
public class HaloDunia {
    public static void main(String[] args) {
        System.out.println("Halo, Dunia!");
    }
}

Output yang Dihasilkan:

text
Halo, Dunia!

Program tersebut hanya lima baris, tetapi setiap baris memiliki peran penting. Mari kita telaah baris-barisnya satu per satu:

  1. Baris 1 (public class HaloDunia {): mendeklarasikan class bernama HaloDunia. Karena class ini bersifat public, nama berkas wajib sama dengan nama class, yaitu HaloDunia.java.
  2. Baris 2 (public static void main(String[] args)): mendeklarasikan method main — pintu masuk yang dicari JVM saat program dijalankan. Tanpa method ini, program tidak memiliki titik awal eksekusi.
  3. Baris 3 (System.out.println("Halo, Dunia!");): statement yang mencetak satu baris teks ke terminal, diakhiri karakter newline. Tanda titik koma wajib menutup setiap statement.
  4. Baris 4-5 (}): menutup blok method main dan blok class. Kurung kurawal harus selalu berpasangan.

Mengompilasi dengan javac #

Java adalah bahasa yang dikompilasi lebih dulu sebelum dijalankan. Buka terminal, masuk ke direktori tempat HaloDunia.java berada, lalu jalankan dua perintah berikut:

text
javac HaloDunia.java
java HaloDunia
Halo, Dunia!

Perintah pertama memerintahkan compiler javac membaca HaloDunia.java dan menerjemahkannya menjadi HaloDunia.class — berkas bytecode, instruksi netral yang dipahami JVM. Perintah pertama tidak mencetak apa pun; tanda kompilasi berhasil adalah munculnya berkas baru berekstensi .class di direktori yang sama. Perintah kedua memerintahkan JVM memuat class HaloDunia lalu menjalankan method main di dalamnya. Nama class ditulis tanpa ekstensi .java maupun .class — JVM mencari class di classpath, bukan berkas sumber.

Menjalankan Berkas Sumber Langsung #

Sejak Java 11, terdapat cara lebih cepat untuk berkas tunggal: perintah java dapat menerima berkas .java secara langsung. JVM akan mengompilasi berkas tersebut di memori lalu langsung menjalankan class pertama di dalamnya:

text
java HaloDunia.java
Halo, Dunia!

Hasilnya sama persis dengan jalur javac dua langkah, tetapi tidak ada berkas .class yang tertinggal di direktori kerja. Mode ini (diperluas oleh JEP 458 agar mendukung program multi-berkas) sangat cocok untuk latihan dan skrip kecil.

Mengubah Program dan Mengompilasi Ulang #

Perangkat lunak berkembang lewat siklus edit → kompilasi → jalankan. Program kedua berikut memperluas HaloDunia menjadi perkenalan diri dengan variabel:

public class PerkenalanDiri {
    public static void main(String[] args) {
        String nama = "Budi Santoso";
        int umur = 17;
        String jurusan = "Rekayasa Perangkat Lunak";

        System.out.println("=== Perkenalan Diri ===");
        System.out.println("Nama   : " + nama);
        System.out.println("Umur   : " + umur);
        System.out.println("Jurusan: " + jurusan);
    }
}

Output yang Dihasilkan:

text
=== Perkenalan Diri ===
Nama   : Budi Santoso
Umur   : 17
Jurusan: Rekayasa Perangkat Lunak

Simpan berkas ini sebagai PerkenalanDiri.java, lalu jalankan java PerkenalanDiri.java. Mari kita amati bagian pentingnya:

  1. Baris 3-5 (String nama = ... dst.): tiga deklarasi variabel — dua String untuk teks dan satu int untuk bilangan bulat — sekaligus mengisi nilainya.
  2. Baris 7-10 (System.out.println(...)): empat statement cetak. Operator + menggabungkan teks dengan nilai variabel menjadi satu string sebelum dicetak.
  3. Baris 4 dan 9 (umur): variabel bertipe int otomatis diubah menjadi representasi teks saat penggabungan terjadi.

Setiap kali kode berubah, ulangi kompilasi sebelum menjalankan; dengan mode berkas tunggal, satu perintah java PerkenalanDiri.java sudah mencakup keduanya.

Kendala Awal yang Sering Muncul #

Kendala klasik pertama: nama berkas tidak sama dengan nama class publiknya. Berikut contoh berkas bernama NamaFile.java yang mendeklarasikan class NamaBeda:

java
public class NamaBeda {
    public static void main(String[] args) {
        System.out.println("uji");
    }
}

Compiler menolak berkas tersebut dan mencetak pesan berikut saat javac NamaFile.java dijalankan:

text
NamaFile.java:1: error: class NamaBeda is public, should be declared in a file named NamaBeda.java
public class NamaBeda {
       ^
1 error

Perbaikannya sederhana: samakan nama berkas dengan nama class publiknya. Kendala kedua: tertukar antara java HaloDunia dan java HaloDunia.java. Argumen tanpa ekstensi berarti “cari berkas .class hasil kompilasi”, sedangkan argumen berekstensi .java berarti “kompilasi lalu jalankan berkas sumber”. Jika kita menjalankan java HaloDunia padahal belum mengompilasi, JVM membalas Error: Could not find or load main class HaloDunia — pesan seperti ini akan kita bedah pada Chapter Membaca Pesan Error.

Program pertama kita kini sudah ditulis, dikompilasi, dan dijalankan melalui dua jalur berbeda. Namun baris-baris di dalamnya belum sepenuhnya kita pahami — apa fungsi class, mengapa main harus bertanda tangan persis seperti itu, dan bagaimana seluruh bagian tersusun berdampingan. Chapter berikutnya membedah anatomi program Java lapis demi lapis.

Referensi #

Berkas Sumber

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

HaloDunia.java

Unduh berkas
java
public class HaloDunia {
    public static void main(String[] args) {
        System.out.println("Halo, Dunia!");
    }
}

PerkenalanDiri.java

Unduh berkas
java
public class PerkenalanDiri {
    public static void main(String[] args) {
        String nama = "Budi Santoso";
        int umur = 17;
        String jurusan = "Rekayasa Perangkat Lunak";

        System.out.println("=== Perkenalan Diri ===");
        System.out.println("Nama   : " + nama);
        System.out.println("Umur   : " + umur);
        System.out.println("Jurusan: " + jurusan);
    }
}