JavaRush /Blog Java /Random-MS /Kenyataan Kembali dalam Java

Kenyataan Kembali dalam Java

Diterbitkan dalam kumpulan

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. Kembalikan pernyataan dalam Java - 1Kelas 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 returnmerujuk 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 maintidak 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 returnkami menentukan nilai pulangan, yang kami gunakan kemudian dalam kaedah println. Dalam huraian (takrif) kaedah, getHelloMessagekami 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 returnia 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 mainjika program java kami dipanggil tanpa parameter. Adalah penting untuk diingat bahawa jika anda returnmempunyai 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 returndalam ifblok:
if (2==2)  {
    return;
}

Kembalikan pernyataan dalam pengendalian ralat

Terdapat satu keadaan yang sangat rumit - kita boleh menggunakannya returnbersama-sama dengan pengendalian ralat. Saya ingin segera mengatakan bahawa menggunakannya returndalam catchblok 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 finallyia sentiasa dilaksanakan. Tetapi tidak, nilainya ialah 1, dan perubahan kepada pembolehubah dalam finallyakan diabaikan. Selain itu, jika ia valuemengandungi objek dan kami finallyberkata value = null, maka ia catchmasih akan mengembalikan rujukan kepada objek, bukan null. Tetapi dari blok finallypengendali returnakan berfungsi dengan betul. Rakan sekerja jelas tidak akan berterima kasih kepada anda untuk hadiah sedemikian.
Apa lagi yang perlu dibaca:

penyata pulangan

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 maindaripada 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
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION