"Hai, Amigo!"
"Hai, Ellie! Apa khabar?"
"Cemerlang, terima kasih. Apa khabar?"
"Bagus, pagi ini banyak perkara baharu telah diterangkan kepada saya."
"Nah, baguslah. Awak tak penat ke?"
"Ya, ada tu. Saya penat sikit."
"Kemudian anda hanya bernasib baik. Saya ingin membincangkan topik yang besar dan rumit hari ini, tetapi pada saat-saat akhir saya mengubah fikiran saya dan memutuskan untuk membincangkan topik yang kecil dan mudah."
"Kecil dan mudah? Saya sudah bersedia."
"Hari ini kita akan mengkaji topik Pengecualian secara terperinci."
"Adakah anda bercakap tentang pengendalian ralat?"
"Anda tidak sepatutnya menganggap pengecualian sebagai ralat. Pengecualian lebih seperti laporan bahawa 'sesuatu yang tidak dijangka berlaku'. Berdasarkan laporan ini, anda boleh mencadangkan tindakan alternatif."
"Ini semua tentang kaedah. Apabila anda memanggil kaedah, ia berjanji untuk melakukan apa yang dipanggil untuk dilakukan. "
"Apabila kaedah, atas sebab apa pun, tidak dapat melakukan apa yang diminta, ia perlu memberitahu pemanggil."
"Dalam erti kata lain, perkara paling teruk yang boleh berlaku adalah untuk kaedah tidak melakukan kerjanya dan tidak memberitahu sesiapa mengenainya. Tidak ada yang mungkin lebih buruk daripada itu. Anda kehilangan kawalan ke atas keadaan apabila itu berlaku. "
"Apabila anda seorang pengaturcara baru, nampaknya anda hanya memanggil kaedah dan mereka pasti melakukan apa yang anda minta mereka lakukan."
"Apabila anda seorang pengaturcara yang berpengalaman, anda tahu bahawa mungkin terdapat berpuluh-puluh faktor yang mempengaruhi keupayaan kaedah untuk melakukan tugasnya, dan terdapat banyak kes yang boleh menghalang kaedah daripada menyelesaikan tugasnya."
"Dari perspektif pengaturcara, ia adalah seribu kali lebih baik jika program ditamatkan apabila ia menghadapi ralat berbanding jika atur cara menghadapi ralat dan kemudian terus berfungsi (tidak betul) tanpa pengguna menyedari apa yang berlaku."
"Jadi program yang menunjukkan sesuatu yang salah mungkin lebih teruk daripada jika program ditutup dan kehilangan semua data?"
"Apa yang membuatkan anda berfikir bahawa program itu hanya menunjukkan sesuatu secara tidak betul? Mungkin program mempunyai banyak pepijat dan semua data anda akan hilang tanpa dapat dipulihkan? Katakan anda telah menaip teks selama 3 jam, tetapi tiada satu pun daripadanya akan disimpan kerana ralat yang berlaku selepas hanya dua minit."
"Apabila pengaturcara baru menghadapi pengecualian, dia menjadi kecewa."
"Tetapi pada hakikatnya, pengecualian mendedahkan semua kemungkinan senario yang sepatutnya dia jangkakan tetapi tidak."
"Anda boleh memilih untuk tidak mengendalikan pengecualian dan itu akan menjadikan anda pengaturcara yang buruk. Tetapi jika kaedah anda tidak membuang pengecualian, maka anda bukan pengaturcara sama sekali — kerana anda gagal memahami kebenaran mudah ini:"
"sesuatu kaedah sama ada melakukan apa yang telah ditulis untuk dilakukan, atau ia membuang pengecualian. Tiada pilihan ketiga!"
"Baiklah, saya percaya awak. Saya berjanji akan menggunakan pengecualian."
"Bagus. Kemudian izinkan saya memberitahu anda tentang hierarki pengecualian:"
"Hierarki pengecualian adalah berdasarkan empat kelas."
"Kelas asas yang paling rendah ialah Throwable ."
" Kelas Ralat dan Pengecualian mewarisinya."
" RuntimeException mewarisi Exception ."
" Kelas Ralat ialah kelas asas untuk ralat JVM seperti StackOverFlow , OutOfMemory , …"
"Sesuatu program biasanya tidak dapat pulih daripada ralat sedemikian, yang menyebabkannya ditamatkan."
"Sememangnya, apakah yang boleh dilakukan jika tidak ada memori yang mencukupi untuk program itu terus berjalan seperti biasa atau terdapat limpahan timbunan?"
" Pengecualian ialah kelas asas untuk semua pengecualian biasa yang dilemparkan oleh program. RuntimeException ialah jenis Pengecualian istimewa yang mempunyai peraturan yang sedikit berbeza."
"Apakah mereka?"
"Itu sahaja yang akan saya jelaskan sekarang."
"Seperti yang anda mungkin ingat, pengecualian terbahagi kepada dua kategori: ditandai dan tidak ditanda ."
"Jika kaedah melontar pengecualian yang diperiksa , maka kaedah yang memanggilnya mesti membungkus panggilan dalam blok cuba-tangkap . Baik, sama ada itu atau buang semula pengecualian (kepada pemanggilnya) dengan menunjukkan lontaran dengan jelas dalam tandatangan kaedah."
"Peraturan/sekatan ini tidak terpakai pada pengecualian yang tidak disemak."
"Jadi, semua pengecualian yang mewarisi Pengecualian dianggap ditandakan. Kecuali pengecualian yang mewarisi RuntimeException, yang dianggap tidak ditandakan."
"Uh-huh. Saya ingat awak ada cakap macam tu dulu."
"Amigo! Mereka bertanya tentang hierarki pengecualian dalam setiap temu duga . Saya akan katakan sekali lagi — setiap temu duga . Anda perlu mengetahui topik ini dengan sempurna."
"OK. Saya akan membaca semuanya sekali lagi dan memikirkannya. Terima kasih kerana membantu saya, Ellie."
GO TO FULL VERSION