Saya terkejut baru-baru ini menemukan bahwa mungkin untuk memiliki pernyataan kembali di blok akhirnya di Jawa.
Sepertinya banyak orang berpikir itu hal yang buruk untuk dilakukan seperti dijelaskan dalam ' Jangan kembali pada akhirnya klausa '. Menggaruk sedikit lebih dalam, saya juga menemukan ' Java's return tidak selalu ' yang menunjukkan beberapa contoh yang cukup mengerikan dari jenis kontrol aliran lainnya di akhirnya blok.
Jadi, pertanyaan saya adalah, adakah yang bisa memberi saya contoh di mana pernyataan kembali (atau kontrol aliran lainnya) di blok akhirnya menghasilkan kode yang lebih baik / lebih mudah dibaca?
sumber
Saya memiliki waktu yang SANGAT sulit untuk melacak bug tahun lalu yang disebabkan oleh ini. Kode itu seperti:
Apa yang terjadi adalah bahwa pengecualian dilemparkan ke dalam beberapa kode lainnya. Itu sedang ditangkap dan dicatat dan dipasang kembali dalam
somethingThatThrewAnException()
metode. Tapi pengecualian itu tidak disebarkan di masa laluproblemMethod()
. Setelah waktu yang lama melihat ini, kami akhirnya melacaknya ke metode pengembalian. Metode pengembalian di blok akhirnya pada dasarnya menghentikan pengecualian yang terjadi di blok percobaan dari merambat meskipun tidak tertangkap.Seperti yang dikatakan orang lain, walaupun legal untuk kembali dari blok akhirnya sesuai dengan spesifikasi Java, itu adalah hal yang BURUK dan tidak boleh dilakukan.
sumber
javac akan memperingatkan kembali akhirnya jika Anda menggunakan -Xlint: akhirnya. Awalnya javac tidak mengeluarkan peringatan - jika ada sesuatu yang salah dengan kode, itu harus gagal dikompilasi. Sayangnya kompatibilitas ke belakang berarti bahwa kebodohan yang tulus dan tak terduga tidak dapat dilarang.
Pengecualian dapat dilemparkan dari blok akhirnya, tetapi dalam kasus itu perilaku yang dipamerkan hampir pasti apa yang Anda inginkan.
sumber
Menambahkan struktur kontrol dan mengembalikan pada akhirnya {} blok hanyalah contoh lain dari "hanya karena Anda bisa" pelanggaran yang tersebar di hampir semua bahasa pengembangan. Jason benar dalam menyarankan itu bisa dengan mudah menjadi mimpi buruk pemeliharaan - argumen terhadap pengembalian awal dari fungsi berlaku lebih-begitu untuk kasus "pengembalian terlambat".
Akhirnya ada blok untuk satu tujuan, untuk memungkinkan Anda merapikan diri Anda sepenuhnya, apa pun yang terjadi di semua kode sebelumnya. Pada dasarnya ini adalah menutup / melepaskan file pointer, koneksi database dll, meskipun saya bisa melihatnya diperluas dengan menambahkan audit dipesan lebih dahulu.
Apa pun yang memengaruhi pengembalian fungsi harus terletak pada blok coba {}. Bahkan jika Anda memiliki metode di mana Anda memeriksa keadaan eksternal, melakukan operasi yang memakan waktu, lalu memeriksa negara itu lagi jika itu menjadi tidak valid, Anda masih ingin pemeriksaan kedua di dalam coba {} - jika itu akhirnya masuk {} dan operasi yang lama gagal, Anda kemudian akan memeriksa keadaan itu untuk kedua kalinya tanpa perlu.
sumber
Tes Groovy sederhana:
Keluaran:
Pertanyaan:
Satu hal yang menarik bagi saya adalah untuk melihat bagaimana Groovy berurusan dengan pengembalian implisit. Dalam Groovy dimungkinkan untuk "kembali" dari suatu metode hanya meninggalkan nilai di akhir (tanpa kembali). Menurut Anda apa yang terjadi, jika Anda menghapus tanda komentar pada baris runningThreads.remove (..) pada pernyataan terakhir - apakah ini akan menimpa nilai pengembalian reguler ("OK") dan mencakup pengecualian ?!
sumber
Kembali dari dalam
finally
blok akan menyebabkanexceptions
hilang.Pernyataan pengembalian di dalam blok akhirnya akan menyebabkan pengecualian yang mungkin dibuang dalam blok coba atau tangkap dibuang.
Menurut Spesifikasi Bahasa Jawa:
Catatan: Sesuai JLS 14.17 - pernyataan pengembalian selalu lengkap secara tiba-tiba.
sumber