Perkenalan
Seperti yang kita ketahui, Java merupakan bahasa pemrograman berorientasi objek. Itulah konsep dasarnya, karena mengatakan bahwa dasar dari asas adalah bahwa segala sesuatu adalah suatu obyek. Objek dideskripsikan menggunakan kelas.
Kelas, pada gilirannya, memiliki keadaan dan perilaku. Misalnya suatu rekening bank dapat mempunyai keadaan berupa jumlah uang di rekening tersebut dan mempunyai perilaku menambah dan mengurangi saldo. Perilaku di Java diimplementasikan menggunakan metode. Cara mendeskripsikan metode diperkenalkan di awal perjalanan pembelajaran Java Anda. Misalnya, dalam tutorial resmi dari Oracle: “
Mendefinisikan Metode ”. Ada dua aspek penting di sini:
- Setiap metode memiliki tanda tangan. Tanda tangan terdiri dari nama metode dan parameter masukannya;
- Metode harus menentukan tipe pengembalian;
- Tipe pengembalian bukan bagian dari tanda tangan metode.
Sekali lagi, ini adalah konsekuensi dari fakta bahwa Java adalah bahasa yang sangat bertipe dan kompiler ingin memahami terlebih dahulu tipe mana yang digunakan sebanyak mungkin. Sekali lagi, untuk melindungi kita dari kesalahan. Secara umum, semuanya untuk kebaikan. Menurut saya, hal ini sekali lagi menanamkan dalam diri kita budaya penanganan data. Jadi, untuk metode, tipe nilainya ditentukan. Dan untuk mengembalikan nilai yang sama dari metode, kata kunci digunakan
return
.
Pernyataan pengembalian kata kunci di Java
Kata kunci pernyataan
return
mengacu pada "pernyataan aliran kontrol" seperti yang dibahas dalam tutorial oracle "
Pernyataan Aliran Kontrol ". Anda juga dapat membaca tentang cara mengembalikan nilai di tutorial resmi: “
Mengembalikan Nilai dari suatu Metode ”. Kompiler dengan hati-hati memonitor, dengan kemampuan terbaiknya, bahwa nilai yang dikembalikan dari suatu metode cocok dengan tipe nilai kembalian yang ditentukan oleh metode tersebut.
Mari kita gunakan IDE Online dari tutorialspoint sebagai contoh . Mari kita lihat contoh aslinya:
public class HelloWorld {
public static void main(String []args) {
System.out.println("Hello World");
}
}
Seperti yang bisa kita lihat, suatu metode dijalankan di sini
main
, yang merupakan titik masuk ke program. Baris kode dieksekusi dari atas ke bawah. Metode kami
main
tidak dapat mengembalikan nilai, jika tidak, kami akan menerima kesalahan: "
Error: Main method must return a value of type void
". Oleh karena itu, metode ini hanya akan menampilkan output ke layar. Sekarang mari kita pindahkan penerimaan string ke metode terpisah untuk menerima pesan:
public class HelloWorld {
public static void main(String []args) {
System.out.println(getHelloMessage());
}
public static String getHelloMessage() {
return "Hello World";
}
}
Seperti yang bisa kita lihat, dengan menggunakan kata kunci
return
kita menentukan nilai kembalian, yang nanti kita gunakan dalam metode ini
println
. Dalam deskripsi (definisi) metode,
getHelloMessage
kami menunjukkan bahwa metode tersebut akan mengembalikan kami
String
. Hal ini memungkinkan compiler untuk memeriksa apakah tindakan metode tersebut konsisten dengan cara deklarasinya. Secara alami, tipe nilai yang dikembalikan yang ditentukan dalam definisi metode bisa lebih luas daripada tipe nilai yang dikembalikan dari kode, yaitu. Hal utama adalah jenisnya direduksi satu sama lain. Jika tidak, kita akan mendapatkan kesalahan waktu kompilasi: "
error: incompatible types
". Omong-omong, pertanyaan yang mungkin langsung muncul: Mengapa
return
ini berlaku untuk operator kontrol aliran program? Namun karena dapat mengganggu alur normal program dari atas ke bawah. Misalnya:
public class HelloWorld {
public static void main(String []args){
if (args.length == 0) {
return;
}
for (String arg : args) {
System.out.println(arg);
}
}
}
Seperti yang bisa dilihat dari contoh, kita menghentikan eksekusi suatu metode
main
jika program java kita dipanggil tanpa parameter. Penting untuk diingat bahwa jika Anda
return
memiliki kode tersebut, kode tersebut menjadi tidak dapat diakses. Dan kompiler cerdas kami akan memperhatikan hal ini dan tidak akan mengizinkan Anda menjalankan program seperti itu. Misalnya, kode ini tidak dapat dikompilasi:
public static void main(String []args) {
System.out.println("1");
return;
System.out.println("2");
}
Ada peretasan kotor untuk menyiasatinya. Misalnya untuk keperluan debugging atau karena alasan lainnya. Kode di atas dapat diperbaiki dengan membungkusnya
return
dalam
if
satu blok:
if (2==2) {
return;
}
Pernyataan pengembalian dalam penanganan kesalahan
Ada satu keadaan yang sangat rumit - kita dapat menggunakannya
return
bersamaan dengan penanganan kesalahan. Saya ingin segera mengatakan bahwa menggunakannya
return
dalam
catch
satu blok adalah bentuk yang sangat, sangat buruk, jadi Anda harus menghindarinya. Tapi kita butuh contoh, bukan? Ini dia:
public class HelloWorld {
public static void main(String []args) {
System.out.println("Value is: " + getIntValue());
}
public static int getIntValue() {
int value = 1;
try {
System.out.println("Something terrible happens");
throw new Exception();
} catch (Exception e) {
System.out.println("Catched value: " + value);
return value;
} finally {
value++;
System.out.println("New value: " + value);
}
}
}
Sekilas sepertinya 2 harus dikembalikan, karena
finally
selalu dieksekusi. Tapi tidak, nilainya akan menjadi 1, dan perubahan pada variabel in
finally
akan diabaikan. Selain itu, jika
value
berisi suatu objek dan kita
finally
katakan
value = null
, maka ia
catch
akan tetap mengembalikan referensi ke objek tersebut, bukan
null
. Tapi dari blok itu
finally
operator
return
akan bekerja dengan benar. Kolega jelas tidak akan berterima kasih atas hadiah seperti itu.
batal.kelas
Dan akhirnya. Anda dapat menulis konstruksi aneh seperti
void.class
. Tampaknya mengapa dan apa gunanya? Faktanya, dalam berbagai kerangka kerja dan kasus rumit yang menggunakan
Java Reflection API , hal ini mungkin sangat diperlukan. Misalnya, Anda dapat memeriksa tipe apa yang dikembalikan suatu metode:
import java.lang.reflect.Method;
public class HelloWorld {
public void getVoidValue() {
}
public static void main(String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == void.class);
}
}
}
Ini dapat berguna dalam kerangka pengujian yang memerlukan penggantian kode metode sebenarnya. Namun untuk melakukan ini, Anda perlu memahami bagaimana metode ini berperilaku (yaitu, tipe apa yang dikembalikannya). Ada cara kedua untuk mengimplementasikan metode
main
dari kode di atas:
public static void main (String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == Void.TYPE);
}
}
Pembahasan yang cukup menarik tentang perbedaan keduanya dapat dibaca di stackoverflow:
Apa perbedaan antara java.lang.Void dan void? #Viacheslav
GO TO FULL VERSION