Method yang kita tulis sejauh ini berjenis void: method melakukan aksi mencetak ke terminal, lalu selesai tanpa menyisakan apa pun bagi pemanggil. Pola seperti itu membatasi method menjadi konsumen akhir — padahal sering kali kita butuh method sebagai penghitung: misalnya kuadrat(7) yang menyerahkan angka 49 kembali kepada pemanggil agar bisa dijumlah, dibandingkan, atau disimpan. Java memakai kata kunci return untuk mengirim nilai balik, dan compiler javac menjaga ketat agar setiap jalur eksekusi method non-void benar-benar mengembalikan nilai. Pada Chapter ini kita pelajari mekanisme return, pemakaiannya pada banyak cabang, serta error missing return statement yang muncul bila satu jalur saja luput.

Kata Kunci return #

Dua hal berubah ketika sebuah method berganti dari void menjadi penghasil nilai. Pertama, return type pada deklarasi diganti dari void menjadi tipe hasil — int, double, String, atau tipe apa pun. Kedua, badan method wajib memuat pernyataan return nilai; yang bertipe sama persis dengan return type-nya. Nilai hasil perjalanan balik ke pemanggil dan menempati posisi pemanggilan itu layaknya sebuah ekspresi:

public class KembalikanHasil {

    // Method dengan return type int: wajib mengembalikan nilai int
    static int kuadrat(int n) {
        return n * n;
    }

    // Method dengan return type double
    static double hitungDiskon(double harga, double persen) {
        return harga * persen / 100.0;
    }

    public static void main(String[] args) {
        int hasil = kuadrat(7);
        System.out.println("kuadrat(7)              = " + hasil);

        // Nilai balik dapat langsung dipakai dalam ekspresi
        System.out.println("kuadrat(3) + kuadrat(4) = " + (kuadrat(3) + kuadrat(4)));

        double harga = 250000;
        System.out.println("diskon 10% dari Rp" + harga + " = Rp" + hitungDiskon(harga, 10));
    }
}

Output yang Dihasilkan:

text
kuadrat(7)              = 49
kuadrat(3) + kuadrat(4) = 25
diskon 10% dari Rp250000.0 = Rp25000.0

Mari kita telaah baris-baris kode di atas:

  1. Baris 4 (static int kuadrat(int n) {): return type int menjadi janji method — setiap pemanggilan kuadrat(...) tersedia sebagai nilai int di sisi pemanggil.
  2. Baris 5 (return n * n;): menghitung n * n, mengirim hasilnya ke pemanggil, dan sekaligus menghentikan eksekusi method saat itu juga. Frame method dibongkar dari call stack.
  3. Baris 16 (int hasil = kuadrat(7);): nilai balik 49 disimpan ke variabel hasil melalui assignment biasa — pemanggilan method berstatus ekspresi bertipe int.
  4. Baris 19 (kuadrat(3) + kuadrat(4)): dua pemanggilan dievaluasi masing-masing menjadi 9 dan 16 sebelum operator + menjumlahkannya. Nilai balik menyatu mulus dalam ekspresi yang lebih besar.

Perhatikan pula hitungDiskon(250000, 10) menghasilkan 25000.0 bertipe double — sesuai return type-nya, bukan int, meski angkanya terlihat bulat.

Return pada Banyak Jalur #

Method dengan percabangan biasanya mengembalikan nilai berbeda di tiap cabang, dan return boleh muncul lebih dari satu kali dalam satu method. Method statusNilai berikut memilih antara dua nilai balik; method nilaiTerbesar menempatkan return di kedua cabang if-else:

public class ReturnDuaJalur {

    // Dua jalur return: cabang if dan akhir method
    static String statusNilai(int nilai) {
        if (nilai >= 75) {
            return "LULUS";
        }
        return "REMEDIAL";
    }

    // Return di dalam if-else: satu di tiap cabang
    static int nilaiTerbesar(int a, int b) {
        if (a >= b) {
            return a;
        } else {
            return b;
        }
    }

    // Void boleh memakai return tanpa nilai untuk berhenti lebih awal
    static void cetakJikaPositif(int n) {
        if (n <= 0) {
            System.out.println(n + " ditolak: bukan bilangan positif");
            return;
        }
        System.out.println(n + " diterima");
    }

    public static void main(String[] args) {
        System.out.println("status 82 : " + statusNilai(82));
        System.out.println("status 74 : " + statusNilai(74));
        System.out.println("terbesar dari 19 dan 41 : " + nilaiTerbesar(19, 41));

        cetakJikaPositif(15);
        cetakJikaPositif(-4);
    }
}

Output yang Dihasilkan:

text
status 82 : LULUS
status 74 : REMEDIAL
terbesar dari 19 dan 41 : 41
15 diterima
-4 ditolak: bukan bilangan positif

Tiga pola return bekerja dalam satu berkas. Method statusNilai memakai dua return: satu di dalam if, satu di ujung badan method — eksekusi yang lolos dari if pasti menabrak return terakhir. Method nilaiTerbesar menaruh return di tiap cabang if-else sehingga tidak butuh return tambahan di akhir. Terakhir, method void bernama cetakJikaPositif memakai return; tanpa nilai sebagai tombol berhenti lebih awal: pemanggilan cetakJikaPositif(-4) mencetak pesan penolakan lalu langsung keluar dari method tanpa menjalankan pernyataan di bawahnya.

Missing Return Statement #

Aturan mainnya tegas: bila return type bukan void, setiap jalur keluar yang mungkin harus melewati return. Cukup satu jalur yang luput, seluruh program gagal dikompilasi. Program berikut melupakan jalur saat n <= 0:

java TanpaReturn.java
public class TanpaReturn {

    static int kuadrat(int n) {
        if (n > 0) {
            return n * n;
        }
        // Jalur saat n <= 0 tidak mengembalikan nilai apa pun
    }

    public static void main(String[] args) {
        System.out.println(kuadrat(5));
    }
}

Compiler javac menolak dengan error: missing return statement sambil menunjuk kurung penutup badan method. Compiler tidak berpijak pada nilai argument yang kebetulan positif di main — analisis dilakukan per jalur eksekusi, dan jalur n <= 0 memungkinkan method berakhir tanpa nilai balik. Perbaikannya sederhana: tambahkan return n * n; setelah blok if (sehingga berlaku untuk semua kasus), atau ubah kondisi menjadi if-else dengan return di kedua cabang.

Dengan return, method kini menjadi penghitung yang dapat diandalkan pemanggil. Pertanyaan berikutnya: bolehkah dua method berbagi nama yang sama? Boleh — selama daftar parameternya berbeda. Mekanisme tersebut bernama method overloading, materi Chapter berikutnya.

Referensi #

Berkas Sumber

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

KembalikanHasil.java

Unduh berkas
java
public class KembalikanHasil {

    // Method dengan return type int: wajib mengembalikan nilai int
    static int kuadrat(int n) {
        return n * n;
    }

    // Method dengan return type double
    static double hitungDiskon(double harga, double persen) {
        return harga * persen / 100.0;
    }

    public static void main(String[] args) {
        int hasil = kuadrat(7);
        System.out.println("kuadrat(7)              = " + hasil);

        // Nilai balik dapat langsung dipakai dalam ekspresi
        System.out.println("kuadrat(3) + kuadrat(4) = " + (kuadrat(3) + kuadrat(4)));

        double harga = 250000;
        System.out.println("diskon 10% dari Rp" + harga + " = Rp" + hitungDiskon(harga, 10));
    }
}

ReturnDuaJalur.java

Unduh berkas
java
public class ReturnDuaJalur {

    // Dua jalur return: cabang if dan akhir method
    static String statusNilai(int nilai) {
        if (nilai >= 75) {
            return "LULUS";
        }
        return "REMEDIAL";
    }

    // Return di dalam if-else: satu di tiap cabang
    static int nilaiTerbesar(int a, int b) {
        if (a >= b) {
            return a;
        } else {
            return b;
        }
    }

    // Void boleh memakai return tanpa nilai untuk berhenti lebih awal
    static void cetakJikaPositif(int n) {
        if (n <= 0) {
            System.out.println(n + " ditolak: bukan bilangan positif");
            return;
        }
        System.out.println(n + " diterima");
    }

    public static void main(String[] args) {
        System.out.println("status 82 : " + statusNilai(82));
        System.out.println("status 74 : " + statusNilai(74));
        System.out.println("terbesar dari 19 dan 41 : " + nilaiTerbesar(19, 41));

        cetakJikaPositif(15);
        cetakJikaPositif(-4);
    }
}

TanpaReturn.java

Unduh berkas
java
public class TanpaReturn {

    static int kuadrat(int n) {
        if (n > 0) {
            return n * n;
        }
        // Jalur saat n <= 0 tidak mengembalikan nilai apa pun
    }

    public static void main(String[] args) {
        System.out.println(kuadrat(5));
    }
}