Mengapa pengecualian dicentang vs tidak dicentang disebut "kontroversi" di tutorial Oracle Java?

10

Saya baru di Jawa dan sedang membaca dokumentasinya tentang pengecualian. , dan khususnya Pengecualian yang Tidak Dicentang - Halaman Kontroversi .

Intinya mengatakan:

Jika klien secara wajar diharapkan pulih dari pengecualian, jadikan itu pengecualian terkecuali. Jika klien tidak dapat melakukan apa pun untuk memulihkan dari pengecualian, jadikan itu pengecualian yang tidak dicentang.

Saya tidak mengerti artikelnya. Tentang apa "kontroversi" itu? Bisakah Anda menjelaskannya dengan kata-kata sederhana?

ABcDexter
sumber
Tolong lihat pertanyaan yang diperbarui, saya tidak merasa ini duplikat :)
ABcDexter
3
"Aku mencoba membacanya," - apa yang terjadi?
berguna
2
Disebut seperti itu karena ada banyak kontroversi seputar topik itu. Lihat juga pertanyaan StackOverflow ini: Kasus terhadap pengecualian yang diperiksa yang menyebutkan beberapa kutipan dari orang
Hulk

Jawaban:

3

Saya akan memberi Anda contoh pertama (tetapi pada akhirnya adalah jawaban mengapa kontroversi).

Mari kita misalkan Anda mengedit dokumen dalam editor dokumen berbasis Java dan setelah Anda selesai Anda memilih File-> Save as ... dan Anda memilih untuk menyimpan dokumen ke dalam volume yang Anda tidak memiliki izin menulis. Editor tidak akan crash pada Anda dengan stacktrace jelek, itu hanya akan memberi tahu Anda bahwa itu tidak dapat menyimpan file dan itu akan membiarkan Anda terus mengedit dan / atau menyimpan ke lokasi lain.

Dalam kasus seperti itu, mungkin pengecualian yang dicentang diharapkan, ditangkap, dan ditindaklanjuti untuk memulihkannya.

Di sisi lain, anggap saja ini sebuah divisi dengan nol atau pengecualian pointer nol yang disebabkan oleh kesalahan pemrograman yang memundurkan kepala jeleknya hanya dalam kondisi tertentu. Itu bisa terjadi di mana saja dalam kode, RAM dapat rusak, dll. Tidak ada API API akan memberitahu Anda "metode ini akan membuang pembagian dengan nol jika RAM rusak" .

Pengecualian yang diperiksa harus menjadi bagian dari desain dan pengguna API itu harus bersiap untuk menanganinya. Pengecualian yang tidak diperiksa dapat terjadi hampir di mana-mana dan berada di luar kendali kami.

Kontroversi muncul dari pemrogram menggunakan pengecualian yang tidak dicentang (memanjang dari RuntimeException) ketika mereka harus menggunakan pengecualian yang diperiksa:

  • sebagai shorcut tidak diganggu oleh kompiler
  • untuk membuat tanda tangan mereka terlihat lebih sederhana
  • karena mereka menganggap bahwa pengecualian yang diperiksa adalah masalah ketergantungan (jika Anda melempar pengecualian yang diperiksa baru di kelas pelaksana, Anda harus memodifikasi tanda tangan antarmuka) dan sebaliknya.
Tulains Córdova
sumber
"Anda harus memodifikasi tanda tangan antarmuka" - well, Anda bahkan dipaksa untuk melakukannya oleh kompiler, dan Anda harus menangani atau menyatakannya untuk dilemparkan di setiap situs panggilan.
Hulk
3
Apakah aplikasi UI benar menangani kesalahan dengan cara yang ramah-pengguna didasarkan pada seberapa baik programmer menulis kode. Mereka dapat menulis kode dengan baik seperti itu dengan pengecualian yang tidak dicentang, sama seperti orang lain dapat dengan tidak benar menangani kesalahan dengan pengecualian yang diperiksa. The niat pengecualian diperiksa adalah untuk memudahkan programmer untuk benar menangani kesalahan. Kontroversi ini bukanlah apa yang Anda klaim di sini, tetapi apakah mereka benar-benar berhasil mencapai tujuan tersebut untuk mempermudah penanganan kesalahan. Dalam pandangan banyak orang, mereka tidak; mereka membuatnya lebih sulit.
Servy
@Servy Dengan cara yang ramah pengguna apa aplikasi UI dapat menangani fakta chip RAM yang gagal, atau dibiarkan tanpa siklus CPU karena perangkat lunak lain tidak berfungsi?
Tulains Córdova
1
@ TulainsCórdova Dalam salah satu kasus tersebut, program ini bahkan tidak akan berjalan , jadi tidak ada pengecualian yang menangani periode yang dilakukan , jadi bagaimana Anda mencoba merepresentasikan kesalahan tidak relevan ketika Anda tidak dapat menjalankan bahkan menjalankan salah satu dari Anda kode ketika itu terjadi.
Servy
1
@ TulainsCórdova Anda tidak perlu harus menemui kesalahan untuk menanganinya, tapi ya, kompiler tidak akan memberi tahu Anda bahwa itu bisa dibuang. Kontroversi adalah apakah kompiler mengatakan kepada Anda bahwa pengecualian dapat dibuang sebenarnya bermanfaat. Beberapa orang berpikir itu adalah, beberapa berpikir itu tidak. Pertanyaannya di sini adalah apa kontroversi , dan itulah jawabannya. Pernyataan Anda tentang apa yang menjadi kontroversi inti dari pengecualian yang diperiksa bukan.
Servy
-4

Tidak ada kontroversi di halaman itu. Oracle memberitahu orang untuk menggunakan pengecualian yang diperiksa.

'Kontroversi' palsu yang mereka temukan di sini adalah antara perancang bahasa dan pengguna bahasa. Para desainer mengizinkan orang untuk melempar dan menangkap benda-benda yang (dalam pikiran mereka) tidak boleh dibuang atau ditangkap. Jadi mereka membuat halaman web yang mengeluh tentang pengembang yang malas.

ascotan
sumber
4
Ada adalah kontroversi bahkan jika halaman yang mengatakan sedikit tentang hal itu. Apa yang kontroversial adalah jawaban untuk pertanyaan, "Apakah pengecualian yang diperiksa membantu atau menghambat pengembangan perangkat lunak yang lebih baik?" Dan, "Jika demikian, pengecualian mana yang harus diperiksa, dan mana yang tidak dicentang?" Saya berani bertaruh bahwa Anda bisa memulai diskusi yang hidup jika Anda punya cukup banyak pengembang (dan bir) di sebuah ruangan untuk menjawab pertanyaan-pertanyaan itu.
Solomon Slow