pengenalan
Seperti yang kita tahu, Java ialah bahasa pengaturcaraan berorientasikan objek. Iaitu, konsep asas, kerana untuk mengatakan asas asas adalah bahawa segala-galanya adalah objek. Objek diterangkan menggunakan kelas.
Kelas pula mempunyai keadaan dan tingkah laku. Sebagai contoh, akaun bank mungkin mempunyai keadaan dalam bentuk jumlah wang dalam akaun dan mempunyai tingkah laku menambah dan mengurangkan baki. Tingkah laku dalam Java dilaksanakan menggunakan kaedah. Cara menerangkan kaedah diperkenalkan pada awal perjalanan pembelajaran Java anda. Sebagai contoh, dalam tutorial rasmi dari Oracle: "
Kaedah Menentukan ". Terdapat dua aspek penting di sini:
- Setiap kaedah mempunyai tandatangan. Tandatangan terdiri daripada nama kaedah dan parameter inputnya;
- Kaedah mesti menentukan jenis pulangan;
- Jenis pulangan bukan sebahagian daripada tandatangan kaedah.
Sekali lagi, ini adalah akibat daripada fakta bahawa Java adalah bahasa yang ditaip dengan kuat dan pengkompil ingin memahami terlebih dahulu jenis mana yang digunakan di mana sebanyak mungkin. Sekali lagi, untuk melindungi kita daripada kesilapan. Secara umum, semuanya adalah untuk kebaikan. Nah, ini sekali lagi menanamkan dalam diri kita budaya pengendalian data, nampaknya saya. Jadi, untuk kaedah jenis nilai ditentukan. Dan untuk mengembalikan nilai yang sama ini daripada kaedah, kata kunci digunakan
return
.
Kenyataan pengembalian kata kunci dalam Java
Kata kunci pernyataan
return
merujuk kepada "penyataan aliran kawalan" seperti yang dibincangkan dalam tutorial oracle "
Pernyataan Aliran Kawalan ". Anda juga boleh membaca tentang cara mengembalikan nilai dalam tutorial rasmi: "
Mengembalikan Nilai daripada Kaedah ". Pengkompil memantau dengan teliti, dengan sebaik mungkin, bahawa nilai yang dikembalikan daripada kaedah sepadan dengan jenis nilai pulangan yang ditentukan oleh kaedah.
Mari gunakan IDE Dalam Talian dari tutorialspoint sebagai contoh . Mari kita lihat contoh asal:
public class HelloWorld {
public static void main(String []args) {
System.out.println("Hello World");
}
}
Seperti yang kita dapat lihat, kaedah dilaksanakan di sini
main
, yang merupakan titik masuk kepada program. Baris kod dilaksanakan dari atas ke bawah. Kaedah kami
main
tidak dapat mengembalikan nilai, jika tidak, kami akan menerima ralat: "
Error: Main method must return a value of type void
". Oleh itu, kaedah ini hanya akan dikeluarkan ke skrin. Sekarang mari kita alihkan penerimaan rentetan ke kaedah yang berasingan untuk menerima mesej:
public class HelloWorld {
public static void main(String []args) {
System.out.println(getHelloMessage());
}
public static String getHelloMessage() {
return "Hello World";
}
}
Seperti yang dapat kita lihat, menggunakan kata kunci
return
kami menentukan nilai pulangan, yang kami gunakan kemudian dalam kaedah
println
. Dalam huraian (takrif) kaedah,
getHelloMessage
kami menunjukkan bahawa ia akan mengembalikan kami
String
. Ini membolehkan pengkompil menyemak sama ada tindakan kaedah itu konsisten dengan cara ia diisytiharkan. Sememangnya, jenis nilai pulangan yang dinyatakan dalam definisi kaedah boleh lebih luas daripada jenis nilai yang dikembalikan daripada kod, i.e. Perkara utama ialah jenis dikurangkan antara satu sama lain. Jika tidak, kami akan mendapat ralat masa kompilasi: "
error: incompatible types
". Ngomong-ngomong, persoalan mungkin segera timbul: Mengapa
return
ia terpakai kepada pengendali kawalan aliran program? Tetapi kerana ia boleh mengganggu aliran biasa program dari atas ke bawah. Sebagai contoh:
public class HelloWorld {
public static void main(String []args){
if (args.length == 0) {
return;
}
for (String arg : args) {
System.out.println(arg);
}
}
}
Seperti yang dapat dilihat daripada contoh, kami mengganggu pelaksanaan kaedah
main
jika program java kami dipanggil tanpa parameter. Adalah penting untuk diingat bahawa jika anda
return
mempunyai kod itu, ia menjadi tidak boleh diakses. Dan pengkompil pintar kami akan melihat ini dan tidak akan membenarkan anda menjalankan program sedemikian. Sebagai contoh, kod ini tidak akan menyusun:
public static void main(String []args) {
System.out.println("1");
return;
System.out.println("2");
}
Terdapat peretasan kotor untuk mengatasi perkara ini. Contohnya, untuk tujuan penyahpepijatan atau atas sebab lain. Kod di atas boleh diperbaiki dengan membungkusnya
return
dalam
if
blok:
if (2==2) {
return;
}
Kembalikan pernyataan dalam pengendalian ralat
Terdapat satu keadaan yang sangat rumit - kita boleh menggunakannya
return
bersama-sama dengan pengendalian ralat. Saya ingin segera mengatakan bahawa menggunakannya
return
dalam
catch
blok adalah bentuk yang sangat, sangat buruk, jadi anda harus mengelakkannya. Tetapi kita memerlukan contoh, bukan? Inilah 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);
}
}
}
Pada pandangan pertama, nampaknya 2 harus dikembalikan, kerana
finally
ia sentiasa dilaksanakan. Tetapi tidak, nilainya ialah 1, dan perubahan kepada pembolehubah dalam
finally
akan diabaikan. Selain itu, jika ia
value
mengandungi objek dan kami
finally
berkata
value = null
, maka ia
catch
masih akan mengembalikan rujukan kepada objek, bukan
null
. Tetapi dari blok
finally
pengendali
return
akan berfungsi dengan betul. Rakan sekerja jelas tidak akan berterima kasih kepada anda untuk hadiah sedemikian.
batal.kelas
Dan akhirnya. Anda boleh menulis pembinaan yang pelik seperti
void.class
. Nampaknya, mengapa dan apa gunanya? Malah, dalam pelbagai rangka kerja dan kes rumit di mana
Java Reflection API digunakan , ini mungkin sangat diperlukan. Sebagai contoh, anda boleh menyemak jenis kaedah yang dikembalikan:
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 boleh berguna dalam rangka kerja ujian yang perlu menggantikan kod kaedah sebenar. Tetapi untuk melakukan ini, anda perlu memahami bagaimana kaedah ini bertindak (iaitu, jenis yang dipulangkan). Terdapat cara kedua untuk melaksanakan kaedah
main
daripada kod di atas:
public static void main (String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == Void.TYPE);
}
}
Perbincangan yang agak menarik tentang perbezaan antara mereka boleh dibaca pada stackoverflow:
Apakah perbezaan antara java.lang.Void dan void? #Viacheslav
GO TO FULL VERSION