Sulit untuk membuat suatu program menjadi sempurna, dan pasti akan terjadi berbagai kelainan. Misalnya ada bug pada program itu sendiri, seperti printer kehabisan kertas saat program mencetak, atau memori tidak mencukupi. Untuk mengatasi pengecualian ini, kita perlu mengetahui mengapa pengecualian tersebut terjadi. Untuk beberapa pengecualian umum, kami juga dapat memberikan rencana respons tertentu. Penanganan pengecualian dalam bahasa C hanya diimplementasikan melalui nilai pengembalian fungsi, namun arti dari nilai pengembalian sering kali ditentukan oleh konvensi. Pemrogram perlu menanyakan sejumlah besar informasi sebelum mereka dapat menemukan alasan yang tidak jelas. Bahasa berorientasi objek, seperti C++, Java, dan Python, seringkali memiliki mekanisme penanganan pengecualian yang lebih kompleks. Mekanisme penanganan pengecualian di Java dibahas di sini.
Penanganan pengecualian Java
Penanganan pengecualian
Sebagian besar mekanisme penanganan pengecualian Java berasal dari C++. Hal ini memungkinkan pemrogram untuk melewati masalah yang tidak dapat ditangani sementara untuk melanjutkan pengembangan selanjutnya, atau untuk memungkinkan program menangani pengecualian dengan lebih cerdas.
Java menggunakan beberapa objek khusus untuk merepresentasikan kondisi abnormal, objek tersebut disebut objek pengecualian. Ketika pengecualian terjadi, Java akan menampilkan objek yang mewakili situasi saat ini berdasarkan pengaturan yang telah ditetapkan. Yang disebut melempar adalah cara pengembalian yang khusus. Thread akan menjeda dan keluar dari pemanggilan metode lapis demi lapis hingga menemukan pengendali pengecualian. Penangan pengecualian dapat menangkap objek pengecualian dan memutuskan tindakan selanjutnya berdasarkan objek tersebut, seperti:
Ingatkan pengguna untuk menangani pengecualian dan melanjutkan program untuk keluar dari program
...
Penangan pengecualian terlihat seperti ini, terdiri dari coba, tangkap, akhirnya dan blok berikutnya. akhirnya tidak diperlukan.
coba { ...;}catch() { ...;}catch() { ...;}akhirnya { ...;}
Penangan pengecualian ini memonitor blok program setelah percobaan. Tanda kurung catch memiliki parameter yang mewakili tipe pengecualian yang akan ditangkap. catch akan menangkap tipe yang sesuai dan kelas turunannya. Blok program setelah try berisi operasi yang akan dilakukan untuk tipe pengecualian. Blok program yang dipantau oleh try mungkin memunculkan lebih dari satu jenis pengecualian, sehingga penangan pengecualian dapat memiliki beberapa modul catch. Blok program setelahnya adalah program yang harus dijalankan terlepas dari apakah terjadi pengecualian.
Kami mencoba program yang mungkin bermasalah dan perlu dipantau, dan merancang solusi untuk menangani pengecualian yang ada.
Berikut ini adalah sebagian program Java yang menggunakan penanganan pengecualian. Bagian try dari program membaca baris teks dari suatu file. Selama proses membaca file, IOException mungkin terjadi:
BufferedReader br = new BufferedReader(new FileReader("file.txt"));coba { StringBuilder sb = new StringBuilder(); ; sb.append("/n"); baris = br.readLine(); } String semuanya = sb.toString();} catch(IOException e) { e.printStackTrace(); System.out.println("IO problem");}akhirnya { br.close();}
Jika kita menangkap objek kelas IOException e, kita dapat mengoperasikan objek tersebut. Misalnya, panggil printStackTrace() objek untuk mencetak status tumpukan saat ini. Selain itu, kami juga mencetak prompt "masalah IO" ke midrange.
Terlepas dari apakah ada pengecualian atau tidak, program pada akhirnya akan memasuki blok akhirnya. Kami menutup file di blok terakhir dan menghapus sumber daya yang ditempati oleh deskriptor file.
jenis pengecualian
Kelas pengecualian di Java semuanya mewarisi dari kelas Trowable. Sebuah objek dari kelas Throwable dapat dilempar (throw).
Oranye: tidak dicentang; biru: dicentang
Benda yang dapat dilempar dapat dibagi menjadi dua kelompok. Satu grup merupakan pengecualian yang tidak dicentang. Mekanisme penanganan pengecualian sering kali tidak digunakan untuk grup pengecualian ini, termasuk:
1. Kelas Error biasanya mengacu pada kesalahan internal Java dan kesalahan seperti kehabisan sumber daya. Ketika terjadi Error (dan turunannya), kita tidak bisa menyelesaikan Error tersebut pada level pemrograman, jadi sebaiknya kita langsung keluar dari program.
2. Kelas Exception memiliki kelas turunan khusus RuntimeException. RuntimeException (dan turunannya) disebabkan oleh program Java itu sendiri, yaitu karena programmer melakukan kesalahan saat memprogram. RuntimeException dapat dihindari sepenuhnya dengan memodifikasi program Java. Misalnya, mengonversi objek dari satu tipe ke tipe lain tanpa hubungan pewarisan adalah ClassCastException. Anomali seperti ini harus dan dapat dihindari.
Sisanya adalah pengecualian yang dicentang. Kelas-kelas ini disebabkan oleh interaksi pemrograman dengan lingkungan yang menyebabkan kesalahan pada program pada saat runtime. Misalnya, saat membaca file, IOException terjadi karena kesalahan pada file itu sendiri. Contoh lainnya adalah server jaringan mengubah arah URL untuk sementara, sehingga menyebabkan MalformedURLException. Sistem file dan server jaringan berada di luar lingkungan Java dan tidak berada dalam kendali pemrogram. Jika pemrogram dapat mengantisipasi pengecualian, mereka dapat menggunakan mekanisme penanganan pengecualian untuk mengembangkan rencana respons. Misalnya, ketika ada masalah dengan file, administrator sistem akan diberitahu. Contoh lainnya adalah ketika ada masalah pada server jaringan, pengguna diingatkan dan menunggu server jaringan pulih. Mekanisme penanganan pengecualian terutama digunakan untuk menangani pengecualian tersebut.
memberikan pengecualian
Dalam program di atas, pengecualian berasal dari panggilan kami ke Java IO API. Kita juga dapat memberikan pengecualian pada program kita sendiri, seperti kelas baterai berikut, yang memiliki metode pengisian dan penggunaan:
Tes kelas publik{ public static void main(String[] args) { Baterai aBattery = Baterai baru(); aBattery.chargeBattery(0,5); aBattery.useBattery(-0,5 }}kelas Baterai { /** * menambah baterai * / public void chargeBattery(double p) { // power <= 1 if (this.power + p < 1.) { this.power = this.power + p; } else { this.power = 1.; } } /** * mengkonsumsi baterai */ public boolean useBattery(double p) { coba { test(p); out.println("tangkap Pengecualian"); System.out.println(e.getMessage()); p = 0,0 } if (ini.kekuatan >= p) { ini.kekuatan = ini.kekuatan - p; return true; } else { this.power = 0.0; return false; p < 0) { Pengecualian e = Pengecualian baru("p harus positif"); lempar e; } daya ganda privat = 0,0;
useBattery() menunjukkan penggunaan operasi baterai. Ada parameter dalam metode useBattery() yang menunjukkan jumlah listrik yang digunakan. Kami menggunakan metode test() untuk menguji parameter ini. Jika parameter ini negatif, maka kami menganggap ada pengecualian dan membuangnya.
Dalam pengujian, ketika pengecualian terjadi (p <0), kita membuat objek Pengecualian e dan menggunakan string sebagai parameter. String berisi informasi terkait pengecualian dan parameter ini tidak diperlukan. Gunakan throw untuk melempar objek Exception.
Kami memiliki pengendali pengecualian di useBattery(). Karena metode test() tidak secara langsung menangani pengecualian yang dihasilkannya, namun melempar pengecualian ke useBattery() bagian atas, kita perlu menjelaskan lemparan Pengecualian dalam definisi test().
(Dengan asumsi bahwa pengendali pengecualian tidak terletak di useBattery(), tetapi dalam metode main() tingkat yang lebih tinggi, kita juga perlu menambahkan lemparan Pengecualian ke definisi useBattery().)
Dalam tangkapannya, kami menggunakan metode getMessage() untuk mengekstrak informasi yang terkandung dalam pengecualiannya. Hasil dari menjalankan program di atas adalah sebagai berikut:
catch Exceptionp harus positif
Di pengendali pengecualian, kami akan menangkap pengecualian apa pun dari kelas Exception atau turunannya. Hal ini sering kali tidak membantu kita mengidentifikasi masalah, terutama ketika suatu program mungkin memunculkan banyak pengecualian. Kami dapat menyediakan kelas yang lebih spesifik untuk ditangkap.
Pengecualian khusus
Kita dapat membuat kelas pengecualian baru melalui pewarisan. Saat mewarisi, kita sering kali perlu mengganti konstruktornya. Pengecualian memiliki dua konstruktor, satu tanpa parameter dan satu lagi dengan parameter String. Misalnya:
kelas BatteryUsageException memperluas Pengecualian{ public BatteryUsageException() {} public BatteryUsageException(String pesan) { super(pesan }}
Kami dapat menyediakan lebih banyak metode dan informasi terkait pengecualian di kelas turunan.
Saat menyesuaikan pengecualian, berhati-hatilah dengan kelas dasar mana yang Anda warisi. Kelas yang lebih spesifik harus berisi lebih banyak informasi pengecualian, seperti IOException versus Exception.
Meringkaskan
Penanganan pengecualian memang menyelesaikan masalah, namun juga menimbulkan masalah. Pada proyek yang besar, penanganan eksepsi yang berlebihan dan detail seringkali menyebabkan program menjadi berantakan. Penanganan pengecualian tidak dirancang sederhana dan perlu digunakan dengan hati-hati.