class throwseg1
{
void show() throws Exception
{
throw new Exception("my.own.Exception");
}
void show2() throws Exception // Why throws is necessary here ?
{
show();
}
void show3() throws Exception // Why throws is necessary here ?
{
show2();
}
public static void main(String s[]) throws Exception // Why throws is necessary here ?
{
throwseg1 o1 = new throwseg1();
o1.show3();
}
}
Mengapa laporan compiler bahwa metode show2()
, show3()
dan main()
memiliki
pengecualian yang tidak dilaporkan Pengecualian yang harus ditangkap atau dinyatakan akan dibuang
kapan saya menghapus throws Exception
dari metode ini?
Exception
, kita harus mendefinisikan metode pemanggilan ( Method2 ) denganthrows Exception
; jika kita tidak memberikan pengecualian itu dalam metode pemanggilan. Tujuan dari ini adalah untuk memberikan kepala ke metode pemanggilan ( Method3 ) dari Metode2 yang Exception mungkin dilemparkan oleh Method2 dan Anda harus menanganinya di sini, jika tidak maka dapat mengganggu program Anda.throws Exception
dalam definisi metodenya untuk memberikan kepala metode pemanggilannya. perpanjangan dari komentar sebelumnyaJawaban:
Di Java, seperti yang Anda ketahui, pengecualian dapat dikategorikan menjadi dua: Satu yang memerlukan
throws
klausa atau harus ditangani jika Anda tidak menentukan satu dan satu lagi tidak. Sekarang, lihat gambar berikut:Di Java, Anda bisa melempar apa pun yang memperluas
Throwable
kelas. Namun, Anda tidak perlu menentukanthrows
klausa untuk semua kelas. Secara khusus, kelas yang baik sebagaiError
atauRuntimeException
atau salah satu subclass dari kedua. Dalam kasus Anda,Exception
ini bukan merupakan subclass dariError
atauRuntimeException
. Jadi, ini adalah pengecualian yang dicentang dan harus ditentukan dalamthrows
klausa, jika Anda tidak menangani pengecualian tersebut. Itulah mengapa Anda membutuhkanthrows
klausul tersebut.Dari Tutorial Java :
Sekarang, seperti yang Anda ketahui, pengecualian diklasifikasikan menjadi dua: dicentang dan tidak dicentang. Mengapa klasifikasi ini?
Pengecualian yang Dicentang: Mereka digunakan untuk mewakili masalah yang dapat dipulihkan selama pelaksanaan program. Mereka biasanya bukan kesalahan programmer. Misalnya, file yang ditentukan oleh pengguna tidak dapat dibaca, atau tidak ada koneksi jaringan yang tersedia, dll., Dalam semua kasus ini, program kami tidak perlu keluar, melainkan dapat mengambil tindakan seperti memberi tahu pengguna, atau beralih ke fallback mekanisme (seperti offline bekerja ketika jaringan tidak tersedia), dll.
Pengecualian yang Tidak Dicentang: Mereka sekali lagi dapat dibagi menjadi dua: Kesalahan dan RuntimeExceptions. Salah satu alasan mereka tidak dicentang adalah jumlahnya banyak, dan diminta untuk menangani semuanya akan mengacaukan program kami dan mengurangi kejelasannya. Alasan lainnya adalah:
Pengecualian Waktu Proses: Biasanya terjadi karena kesalahan programmer. Misalnya, jika terjadi
ArithmeticException
pembagian dengan nol atauArrayIndexOutOfBoundsException
terjadi, itu karena kami kurang berhati-hati dalam pengkodean kami. Mereka biasanya terjadi karena beberapa kesalahan dalam logika program kami. Jadi, mereka harus dibersihkan sebelum program kita memasuki mode produksi. Mereka tidak dicentang dalam arti bahwa, program kita harus gagal ketika itu terjadi, sehingga kita para pemrogram dapat menyelesaikannya pada saat pengembangan dan pengujian itu sendiri.Kesalahan: Kesalahan adalah situasi yang biasanya program tidak dapat dipulihkan. Misalnya, jika
StackOverflowError
terjadi, program kami tidak dapat berbuat banyak, seperti meningkatkan ukuran stack pemanggil fungsi program. Atau jikaOutOfMemoryError
terjadi, kami tidak dapat berbuat banyak untuk meningkatkan jumlah RAM yang tersedia untuk program kami. Dalam kasus seperti itu, lebih baik keluar dari program. Itulah mengapa mereka dibuat tidak dicentang.Untuk informasi rinci, lihat:
sumber
Java mengharuskan Anda menangani atau mendeklarasikan semua pengecualian. Jika Anda tidak menangani Exception menggunakan blok coba / tangkap maka itu harus dideklarasikan dalam tanda tangan metode.
Sebagai contoh:
Harus ditulis sebagai:
Dengan cara ini Anda bisa menyingkirkan deklarasi "throws Exception" dalam deklarasi metode.
sumber
RuntimeException
.Throwable
(mewarisiException
juga berfungsi, karena meluasThrowable
, tetapi tidak wajib).The
throws Exception
deklarasi adalah cara otomatis melacak metode yang mungkin melemparkan pengecualian untuk alasan diantisipasi tetapi tidak dapat dihindari. Deklarasi biasanya spesifik tentang tipe atau tipe pengecualian yang mungkin dilemparkan sepertithrows IOException
atauthrows IOException, MyException
.Kita semua memiliki atau pada akhirnya akan menulis kode yang berhenti tiba-tiba dan melaporkan pengecualian karena sesuatu yang tidak kita antisipasi sebelum menjalankan program, seperti pembagian dengan nol atau indeks di luar batas. Karena kesalahan tidak diharapkan oleh metode, mereka tidak dapat "ditangkap" dan ditangani dengan klausa coba tangkap. Pengguna metode yang tidak curiga juga tidak akan mengetahui kemungkinan ini dan program mereka juga akan berhenti.
Ketika pemrogram mengetahui jenis kesalahan tertentu yang mungkin terjadi tetapi ingin menangani pengecualian ini di luar metode, metode dapat "melempar" satu atau lebih jenis pengecualian ke metode pemanggil alih-alih menanganinya. Jika pemrogram tidak mendeklarasikan bahwa metode (mungkin) memunculkan pengecualian (atau jika Java tidak memiliki kemampuan untuk mendeklarasikannya), kompilator tidak dapat mengetahuinya dan akan tergantung pada pengguna metode yang akan datang untuk mengetahuinya, menangkap dan menangani pengecualian apa pun yang mungkin dilontarkan metode. Karena program dapat memiliki banyak lapisan metode yang ditulis oleh banyak program berbeda, menjadi sulit (tidak mungkin) untuk melacak metode mana yang mungkin mengeluarkan pengecualian.
Meskipun Java memiliki kemampuan untuk mendeklarasikan pengecualian, Anda masih dapat menulis metode baru dengan pengecualian yang tidak tertangani dan tidak dideklarasikan, dan Java akan mengkompilasinya dan Anda dapat menjalankannya dan berharap yang terbaik. Apa yang tidak boleh dilakukan oleh Java adalah mengompilasi metode baru Anda jika ia menggunakan metode yang telah dideklarasikan sebagai pelemparan pengecualian, kecuali Anda menangani pengecualian yang dideklarasikan dalam metode Anda atau mendeklarasikan metode Anda sebagai melempar yang sama pengecualian atau jika ada beberapa pengecualian, Anda dapat menangani beberapa dan membuang sisanya.
Ketika seorang programmer menyatakan bahwa metode tersebut melempar tipe pengecualian tertentu, itu hanyalah cara otomatis untuk memperingatkan programmer lain menggunakan metode bahwa pengecualian dimungkinkan. Programmer kemudian dapat memutuskan untuk menangani pengecualian atau meneruskan peringatan dengan mendeklarasikan metode pemanggilan sebagai juga melempar pengecualian yang sama. Karena kompilator telah diperingatkan, pengecualian dimungkinkan dalam metode baru ini, ia dapat secara otomatis memeriksa apakah pemanggil metode baru di masa mendatang menangani pengecualian atau mendeklarasikannya dan memaksakan satu atau yang lain terjadi.
Hal yang menyenangkan tentang jenis solusi ini adalah ketika kompilator melaporkannya
Error: Unhandled exception type java.io.IOException
memberikan file dan nomor baris dari metode yang dideklarasikan untuk membuang pengecualian. Anda kemudian dapat memilih untuk meneruskan tanggung jawab dan mendeklarasikan metode Anda juga "melempar IOException". Ini bisa dilakukan sampai ke metode utama yang kemudian akan menyebabkan program berhenti dan melaporkan pengecualian kepada pengguna. Namun, lebih baik menangkap pengecualian dan menanganinya dengan cara yang baik seperti menjelaskan kepada pengguna apa yang telah terjadi dan bagaimana memperbaikinya. Ketika sebuah metode menangkap dan menangani pengecualian, metode tersebut tidak lagi harus mendeklarasikan pengecualian. Uang berhenti di situ untuk berbicara.sumber
Exception
adalah kelas pengecualian yang dicentang. Oleh karena itu, kode apa pun yang memanggil metode yang menyatakan bahwa iathrows Exception
harus menangani atau mendeklarasikannya.sumber
Hanya perubahan kecil dalam program Anda. Apa yang tampaknya disalahpahami oleh banyak orang tentang masalah utama, adalah setiap kali Anda mengeluarkan pengecualian, Anda perlu menanganinya, tidak perlu di tempat yang sama (mis. Metode show1,2,3 dalam program Anda) tetapi Anda harus pada metode pemanggil pertama di dalam 'utama'. dalam satu kata, ada 'lemparan', harus ada 'tangkap / coba', bahkan jika bukan metode yang sama di mana pengecualian terjadi.
sumber
Karena ada pengecualian yang diperiksa dalam metode show (), yang tidak ditangani dalam metode itu, jadi kami menggunakan kata kunci lemparan untuk menyebarkan Exception.
Karena Anda menggunakan metode show () dalam metode show2 () dan Anda telah menyebarkan pengecualian setidaknya yang harus Anda tangani di sini. Jika Anda tidak menangani Exception di sini, maka Anda menggunakan kata kunci throws. Jadi itulah alasan untuk menggunakan kata kunci lemparan pada tanda tangan metode.
sumber
Jika Anda menyebarkan pengecualian dengan mendeklarasikan direktif throws dalam tanda tangan metode saat ini, maka di suatu tempat di atas garis atau memanggil tumpukan, konstruksi coba / tangkap harus digunakan untuk menangani pengecualian.
sumber
Pada dasarnya, jika Anda tidak menangani pengecualian di tempat yang sama saat Anda melemparkannya, maka Anda dapat menggunakan "throws exception" pada definisi fungsi tersebut.
sumber