Haruskah metode yang menampilkan RuntimeException menunjukkannya dalam tanda tangan metode?

86

Misalnya, banyak metode dalam framework / JDK yang mungkin dilontarkan

java.lang.SecurityException 

tetapi ini tidak ditunjukkan dalam tanda tangan metode (karena itu adalah praktik yang biasanya disediakan untuk pengecualian yang dicentang). Saya ingin menyatakan bahwa mendeklarasikan RuntimeExceptions di metode sigs memiliki banyak manfaat (mirip dengan pemeriksaan tipe statis misalnya). Apakah saya mabuk atau sebaliknya?

Jacques René Mesrine
sumber

Jawaban:

70

Saya tidak akan mendeklarasikan pengecualian yang tidak dicentang pada tanda tangan, karena menyesatkan pengguna API tersebut. Tidak jelas lagi apakah pengecualian harus ditangani secara eksplisit.

Mendeklarasikannya di javadoc adalah pendekatan yang lebih baik karena memungkinkan seseorang untuk menanganinya jika menurut mereka perlu, tetapi mengetahui bahwa mereka dapat mengabaikannya jika mereka mau. Ini membuat pemisahan antara dicentang dan tidak dicentang menjadi jelas.

Robin
sumber
4
Kompilator java tidak memaksa Anda, untuk menangani RuntimeExceptions yang dideklarasikan. Jadi Anda bisa mendeklarasikannya, untuk tujuan sebagai "petunjuk" bagi developer. Bisa dibicarakan, jika JavaDoc adalah tempat yang lebih baik untuk itu. Poin tentang Pengecualian yang dicentang dan yang tidak dicentang adalah penting. Pengecualian yang dicentang dan tidak dicentang adalah, apa yang dimaksud Java dengan Pengecualian (Compiletime-) (dicentang) dan RuntimeExceptions (tidak dicentang).
Guardian667
6
Di Spring mendeklarasikan pengecualian yang tidak dicentang dalam tanda tangan metode mulai menjadi praktik umum.
johnlemon
39

Dari tutorial Oracle Java :

"Jika sangat bagus untuk mendokumentasikan API metode, termasuk pengecualian yang dapat dilontarkannya, mengapa tidak menentukan pengecualian waktu proses juga?" Pengecualian waktu proses menunjukkan masalah yang diakibatkan oleh masalah pemrograman, dan dengan demikian, kode klien API tidak dapat diharapkan secara wajar untuk dipulihkan dari masalah tersebut atau menanganinya dengan cara apa pun. Masalah seperti itu termasuk pengecualian aritmatika, seperti membagi dengan nol; pengecualian pointer, seperti mencoba mengakses objek melalui referensi null; dan pengecualian indeks, seperti mencoba mengakses elemen array melalui indeks yang terlalu besar atau terlalu kecil.

Pengecualian waktu proses dapat terjadi di mana saja dalam suatu program, dan pada program yang umum, pengecualian tersebut bisa sangat banyak. Keharusan menambahkan pengecualian waktu proses di setiap deklarasi metode akan mengurangi kejelasan program.

Dheeraj Vepakomma
sumber
Jadi, kompilator tidak mengharuskan Anda menangkap atau menetapkan pengecualian waktu proses (meskipun Anda bisa).
johnlemon
18

Lihat javadoc untuk Collection # add

Ada banyak sekali pengecualian yang tidak dicentang yang disebutkan:

Throws:
UnsupportedOperationException - add is not supported by this collection.
ClassCastException - class of the specified element prevents it from being added to this collection.
NullPointerException - if the specified element is null and this collection does not support null elements.
IllegalArgumentException - some aspect of this element prevents it from being added to this collection.

Jika Anda memiliki kesabaran, saya sarankan untuk mendokumentasikan secara menyeluruh kemungkinan pengecualian yang diberikan oleh metode Anda dengan cara ini. Di satu sisi, bahkan lebih penting untuk melakukan ini untuk pengecualian yang tidak dicentang, karena pengecualian yang dicentang agak terdokumentasi sendiri (kompilator memaksa kode pemanggil untuk mengakuinya).

Sam Barnum
sumber
6
Jawaban ini salah. Anda berbicara tentang pernyataan Javadoc sementara pertanyaan tentang throwsdi tanda tangan metode. Ini bukanlah hal yang sama. Ya, Anda benar - benar harus mendokumentasikan semua pengecualian yang diberikan oleh API Anda, tetapi pertanyaannya bukan tentang itu.
Gili
8

Dalam sudut pandang saya, lebih baik mendeklarasikan pengecualian waktu proses setidaknya di javadoc untuk metode tersebut. Mendeklarasikannya dalam tanda tangan semakin memperjelas apa yang mungkin terjadi jika terjadi kesalahan. Ini adalah alasan utama saya menyarankan untuk memberikan informasi ini.

FYI: seiring berjalannya waktu (sekarang di tahun 2017) saya sekarang lebih condong untuk mendokumentasikannya dalam javadoc saja dan menghindari pengecualian yang dicentang sebanyak mungkin.

Patrick Cornelissen
sumber
3

Dalam pandangan saya, pengecualian yang tidak dicentang tidak boleh dideklarasikan dalam tanda tangan metode karena bertentangan dengan sifatnya.

Namun, jika suatu metode cenderung menampilkan beberapa pengecualian yang tidak dicentang, yang mencatat kemungkinan keadaan di @throws di Javadoc dapat membantu orang lain yang menggunakan metode tersebut untuk memahami apa yang bisa salah. Ini hanya berguna untuk pengecualian yang kemungkinan besar dapat ditangani oleh penelepon (seperti NPE karena input yang buruk, dll.)

Keris
sumber
3

Jika Anda menulis api untuk digunakan oleh orang lain, maka ada banyak alasan untuk dokumentasi eksplisit maksud Anda dalam api dan tidak ada kerugian untuk mendeklarasikan RuntimeExceptions dalam tanda tangan metode.

alphazero.dll
sumber
1

Ini ada hubungannya dengan diskusi tentang pengecualian yang dicentang . Sebagian besar akan setuju bahwa pengecualian tidak boleh dideklarasikan dalam tanda tangan metode.

Ada juga diskusi tentang bagaimana pengecualian waktu proses harus digunakan. Saya setuju dengan satu poster bahwa pengecualian waktu proses harus menunjukkan kesalahan pemrograman atau kondisi fatal. Jadi tidak banyak gunanya menyatakannya dalam tanda tangan. Setiap metode berpotensi melalui satu.

kgiannakakis
sumber
Di mana pengecualian parsing atau beberapa pengecualian jenis validasi data lainnya cocok dengan itu. Anda menyiratkan bahwa Anda tidak boleh menggunakan pengecualian yang dicentang tetapi kemudian membatasi tujuan penggunaan pengecualian yang tidak dicentang.
Robin
1
Apa yang saya katakan adalah bahwa pengembang tidak boleh dipaksa untuk menangkap pengecualian yang dicentang. Jadi tidak perlu mendeklarasikannya dalam tanda tangan metode. Di Java, Anda dapat mengubahnya dalam pengecualian waktu proses, seperti yang dilakukan Spring. Saya juga mengatakan bahwa pengecualian waktu proses harus diterapkan hanya pada situasi yang tidak dapat dipulihkan.
kgiannakakis