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:
kuadrat(7) = 49
kuadrat(3) + kuadrat(4) = 25
diskon 10% dari Rp250000.0 = Rp25000.0Mari kita telaah baris-baris kode di atas:
- Baris 4 (
static int kuadrat(int n) {): return typeintmenjadi janji method — setiap pemanggilankuadrat(...)tersedia sebagai nilaiintdi sisi pemanggil. - Baris 5 (
return n * n;): menghitungn * n, mengirim hasilnya ke pemanggil, dan sekaligus menghentikan eksekusi method saat itu juga. Frame method dibongkar dari call stack. - Baris 16 (
int hasil = kuadrat(7);): nilai balik49disimpan ke variabelhasilmelalui assignment biasa — pemanggilan method berstatus ekspresi bertipeint. - Baris 19 (
kuadrat(3) + kuadrat(4)): dua pemanggilan dievaluasi masing-masing menjadi9dan16sebelum 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:
status 82 : LULUS
status 74 : REMEDIAL
terbesar dari 19 dan 41 : 41
15 diterima
-4 ditolak: bukan bilangan positifTiga 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:
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 #
- JLS SE25 §14.43: The return Statement
- JLS SE25 §8.4.7: Method Body
- Java API: java.lang.Math (contoh method dengan return value)
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
KembalikanHasil.java
Unduh berkaspublic 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 berkaspublic 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 berkaspublic 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));
}
}