CodeGym /Blog Java /rawak /Kata kunci pengembalian Java
John Squirrels
Tahap
San Francisco

Kata kunci pengembalian Java

Diterbitkan dalam kumpulan
Seperti yang kita ketahui, bahasa Java adalah bahasa pengaturcaraan berorientasikan objek. Dalam erti kata lain, konsep asas, iaitu asas asas, ialah segala-galanya adalah objek. Objek diterangkan menggunakan kelas. Kelas pula menentukan keadaan dan tingkah laku. Sebagai contoh, akaun bank mungkin mempunyai keadaan dalam bentuk jumlah wang dalam akaun dan mempunyai tingkah laku yang meningkatkan dan mengurangkan baki akaun. Di Jawa, tingkah laku dilaksanakan melalui kaedah. Mempelajari cara mentakrifkan kaedah datang pada permulaan pengajian Java anda. Sebagai contoh, dalam tutorial rasmi Oracle, di bawah tajuk " Kaedah Menentukan ". Terdapat dua perkara penting yang perlu diambil perhatian di sini:
  • Setiap kaedah mempunyai tandatangan. Tandatangan terdiri daripada nama kaedah dan parameter inputnya.
  • Jenis pemulangan mesti dinyatakan untuk kaedah. Anda mengisytiharkan jenis pulangan kaedah dalam pengisytiharan kaedahnya.
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 mengetahui jenis yang digunakan dan di mana, terlebih dahulu dan sebanyak mungkin. Sekali lagi, ini untuk menyelamatkan kita daripada kesilapan. Pada asasnya, itu semua untuk tujuan yang baik. Dan nampaknya saya ini sekali lagi menanamkan dalam diri kita budaya pengendalian data. Jadi, jenis nilai pulangan ditentukan untuk kaedah. Dan kata kunci pulangan dalam Java digunakan untuk benar-benar melakukan pengembalian. Kata kunci pengembalian Java - 1

Apa yang dilakukan kembali di Jawa

Kata kunci pulangan ialah pernyataan aliran kawalan, seperti yang diterangkan dalam tutorial Oracle di sini . Anda juga boleh membaca tentang cara mengembalikan nilai dalam bahagian " Mengembalikan Nilai daripada Kaedah " dalam tutorial rasmi. Pengkompil dengan teliti menjejaki sama ada ia boleh memastikan bahawa nilai pulangan kaedah sepadan dengan jenis pulangan yang ditentukan oleh kaedah tersebut. Mari gunakan IDE Dalam Talian Tutorialspoint untuk mempertimbangkan contoh. Mari kita lihat contoh purba:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
Seperti yang kita dapat lihat, kaedah utama dilaksanakan di sini, iaitu titik masuk program. Baris kod dilaksanakan dari atas ke bawah. Kaedah utama kami tidak dapat mengembalikan nilai. Jika kami cuba mengembalikan nilai di sana, kami akan mendapat ralat: "Ralat: Kaedah utama mesti mengembalikan nilai jenis void" . Sehubungan itu, kaedah itu hanya akan dioutput ke skrin. Sekarang mari kita alihkan rentetan literal ke kaedah yang berasingan untuk menjana mesej:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println(getHelloMessage());
    }
    
    public static String getHelloMessage() {
        return "Hello World";
    }
    
}
Seperti yang kita lihat, kami menggunakan kata kunci pulangan untuk menunjukkan nilai pulangan, yang kemudiannya kami hantar ke kaedah println . Pengisytiharan kaedah getHelloMessage menunjukkan bahawa kaedah itu akan mengembalikan String . Ini membolehkan pengkompil menyemak sama ada tindakan kaedah itu konsisten dengan cara ia diisytiharkan. Sememangnya, jenis pulangan yang dinyatakan dalam pengisytiharan kaedah boleh lebih luas daripada jenis nilai yang sebenarnya dikembalikan dalam kod, iaitu yang penting ialah penukaran jenis adalah mungkin. Jika tidak, kami akan mendapat ralat pada masa penyusunan: "Ralat: jenis tidak serasi" . By the way, anda mungkin mempunyai soalan: Mengapa pulangandianggap sebagai pernyataan aliran kawalan? Kerana ia boleh mengganggu aliran atas-bawah biasa sesuatu program. 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 anda lihat daripada contoh, kami mengganggu kaedah utama dalam program Java jika ia dipanggil tanpa hujah. Adalah penting untuk diingat bahawa jika anda mempunyai kod selepas penyata pemulangan , ia tidak akan dapat diakses. Pengkompil pintar kami akan menyedarinya dan menghalang anda daripada menjalankan program sedemikian. Sebagai contoh, kod ini tidak menyusun:

public static void main(String[] args) {
        System.out.println("1");
        return;
// we use output method after return statement, which is incorrect 
        System.out.println("2");
 }
Terdapat satu hack kotor untuk mengatasi perkara ini. Contohnya, untuk tujuan penyahpepijatan, atau atas sebab lain. Kod di atas boleh diperbaiki dengan membungkus pernyataan pulangan dalam blok if :

if (2==2) {
    return;
}

Kembalikan pernyataan semasa pengendalian ralat

Terdapat perkara lain yang sangat rumit — kita boleh menggunakan pulangan bersama-sama dengan pengendalian ralat. Saya ingin segera mengatakan bahawa menggunakan pernyataan pulangan dalam blok tangkapan adalah bentuk yang sangat, sangat buruk, jadi anda harus mengelakkannya. Tetapi kita perlukan contoh, bukan? Ini dia:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Value: " + getIntValue());
    }
    
    public static int getIntValue() {
        int value = 1;
        try {
            System.out.println("Something terrible happens");
            throw new Exception();
        } catch (Exception e) {
            System.out.println("Cached value: " + value);
            return value;
        } finally {
            value++;
            System.out.println("New value: " + value);
        }
    }
    
}
Pada pandangan pertama, nampaknya 2 harus dikembalikan, kerana akhirnya sentiasa dilaksanakan. Tetapi tidak, nilai pulangan akan menjadi 1, dan perubahan kepada pembolehubah dalam blok akhirnya akan diabaikan. Selain itu, katakan nilai itu mengandungi objek dan kita katakan nilai = null dalam blok akhirnya . Kemudian objek itu, bukan nol, akan dikembalikan dalam blok tangkapan . Tetapi pernyataan pulangan akan berfungsi dengan betul dalam blok akhirnya . Jelas sekali, rakan sekerja anda tidak akan berterima kasih atas kejutan kecil yang melibatkan penyata pulangan.

batal.kelas

Dan akhirnya. Terdapat binaan aneh ini yang boleh anda tulis: void.class . Hmm. Mengapa dan apakah maksudnya? Terdapat pelbagai rangka kerja dan kes rumit yang melibatkan Java Reflection API di mana ini boleh menjadi sangat berguna. 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 di mana anda perlu menggantikan kod sebenar dalam kaedah. Tetapi untuk melakukan ini, anda perlu memahami bagaimana kaedah bertindak (iaitu jenis apa yang dikembalikan). Terdapat juga cara kedua untuk melaksanakan kaedah utama dalam kod di atas:

public static void main(String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == Void.TYPE);
        }
 }
Anda boleh membaca perbincangan yang cukup menarik tentang perbezaan antara keduanya di Stack Overflow: Apakah perbezaan antara java.lang.Void dan void?
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION