JavaRush /Java Blog /Random-ID /Pernyataan Pengembalian di Java
Viacheslav
Level 3

Pernyataan Pengembalian di Java

Dipublikasikan di grup Random-ID

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. Pernyataan pengembalian di Java - 1Kelas, 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 returnmengacu 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 maintidak 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 returnkita menentukan nilai kembalian, yang nanti kita gunakan dalam metode ini println. Dalam deskripsi (definisi) metode, getHelloMessagekami 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 returnini 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 mainjika program java kita dipanggil tanpa parameter. Penting untuk diingat bahwa jika Anda returnmemiliki 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 returndalam ifsatu blok:
if (2==2)  {
    return;
}

Pernyataan pengembalian dalam penanganan kesalahan

Ada satu keadaan yang sangat rumit - kita dapat menggunakannya returnbersamaan dengan penanganan kesalahan. Saya ingin segera mengatakan bahwa menggunakannya returndalam catchsatu 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 finallyselalu dieksekusi. Tapi tidak, nilainya akan menjadi 1, dan perubahan pada variabel in finallyakan diabaikan. Selain itu, jika valueberisi suatu objek dan kita finallykatakan value = null, maka ia catchakan tetap mengembalikan referensi ke objek tersebut, bukan null. Tapi dari blok itu finallyoperator returnakan bekerja dengan benar. Kolega jelas tidak akan berterima kasih atas hadiah seperti itu.
Apa lagi yang harus dibaca:

pernyataan pengembalian

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