Iklan

Pengecualian dalam pemrograman menandakan kondisi luar biasa di beberapa titik dalam pelaksanaan program. Ini digunakan ketika kondisi luar biasa dapat ditangani lebih baik di tempat lain daripada di mana ia ditemui. Perhatikan contoh-contoh berikut:

  • Kegagalan untuk membuka file konfigurasi dapat ditangani dengan lebih baik dalam kode, mungkin dengan menggunakan lokasi file konfigurasi alternatif.
  • Mengakses item array Cara Menggunakan Daftar Java ArrayDaftar array Java adalah array yang dapat diubah ukurannya untuk keperluan umum. Ini menyediakan sebagian besar fasilitas yang umumnya diharapkan dari array dalam bahasa lain. Pada artikel ini Anda akan belajar mengatur dan menggunakan daftar array. Baca lebih banyak di luar batas array menandakan bug program. Selamat men-debug!
  • Kesalahan parsing XML harus dibawa ke pemberitahuan pengguna sehingga file XML dapat diperbaiki.
  • Program kehabisan memori (mungkin saat memproses file besar) dapat diperbaiki dengan mungkin menambah jumlah memori yang tersedia untuk proses java.

Dalam semua kasus ini (dan banyak lagi), pengecualian harus ditangani di luar lokasi di mana ia dihasilkan sehingga penyebab yang mendasarinya dapat diatasi.

Jenis Pengecualian

Gambar di bawah ini menunjukkan bagian utama dari Java Exception Hierarchy. Kelas dasar adalah Bisa dibuang yang dikelompokkan ke dalam Pengecualian dan Kesalahan. Kelas Pengecualian adalah untuk kondisi terkait program yang dapat ditangkap aplikasi dalam upaya untuk menyelamatkan situasi. Kelas Kesalahan, di sisi lain, adalah untuk menunjukkan kesalahan serius dalam Java Run-time Environment yang tidak boleh ditangkap aplikasi. Beberapa contoh adalah: OutOfMemoryError dan StackOverflowError.

Hirarki Pengecualian

Sebuah Pengecualian lagi adalah dua jenis: dicentang dan tidak dicentang. Pengecualian yang diperiksa harus ditangani oleh kode panggilan. Aturan ini diberlakukan oleh kompiler java. Pengecualian yang tidak dicentang, di sisi lain, dapat diperbanyak ke rantai panggilan tanpa harus menyatakannya secara eksplisit. Contoh di bawah ini akan menjelaskan.

Pengecualian yang Diperiksa

Metode berikut mencoba membuat FileReader dari file. Konstruktor melempar pengecualian yang diperiksa FileNotFoundException yang harus ditangani oleh kode panggilan atau dinyatakan dibuang.

Kode berikut akan tidak kompilasi karena tidak ada.

private void loadFile (String filename) {FileReader in = FileReader baru (nama file); }

Salah satu cara untuk mendapatkan kode untuk dikompilasi adalah dengan menangani pengecualian (lihat di bawah).

private void loadFile (String filename) {coba {FileReader di = FileReader baru (nama file)); {} catch (FileNotFoundException ex) {// menangani pengecualian di sini} }

Jika pengecualian tidak dapat ditangani secara langsung oleh penelepon, itu harus dinyatakan dalam tanda tangan metode.

private void loadFile (String filename) melempar java.io. FileNotFoundException. {FileReader in = FileReader baru (nama file)); { }

Pengecualian tidak dicentang

Pengecualian tidak dicentang adalah salah satu yang disubclass dari RuntimeException dan tidak perlu ditangani secara langsung atau dinyatakan seperti di atas. Misalnya, kode berikut ini menghasilkan a NullPointerException, yang merupakan jenis RuntimeException. Kode, bagaimanapun mengkompilasi tanpa kesalahan sejak NullPointerException adalah pengecualian yang tidak dicentang.

private void handleEvent () {String name = null; if (name.length ()> 0) {} }

Pengecualian Pembungkus

Mengingat diskusi di atas tentang pengecualian yang diperiksa dan tidak dicentang, tampaknya lebih mudah untuk menangani pengecualian yang tidak dicentang karena Anda tidak harus mendeklarasikan atau menanganinya sendiri. Dengan mengingat kenyamanan itu, kadang-kadang mungkin berguna untuk membungkus pengecualian yang diperiksa dalam pengecualian yang tidak dicentang.

Contoh kode berikut menunjukkan cara membungkus pengecualian. Metode method_1 () melempar SQLException di tubuhnya. Agar kode dikompilasi dengan benar, pengecualian harus dinyatakan dibuang.

private void method_1 () melempar SQLException {... melempar SQLException baru; }

Ketika metode ini dipanggil dari metode lain (method_2 ()), metode itu dapat menangkap SQLException dan membungkusnya di dalam pengecualian yang tidak dicentang, sehingga tidak harus mendeklarasikan pengecualian dalam tanda tangan metode.

private void method_2 () {coba {method_1 (); } catch (java.sql. SQLException ex) {throw new RuntimeException (ex); } }

Jejak Tumpukan Pengecualian

Exception Stack Trace mengacu pada susunan frame tumpukan aktif, yang masing-masing mewakili pemanggilan metode, ditangkap oleh JVM pada saat pengecualian dilemparkan. Setiap frame stack menyertakan lokasi doa metode termasuk nama kelas, nama metode, dan mungkin nama file sumber java dan nomor baris dalam file. Ini berguna untuk melacak urutan panggilan yang menyebabkan kesalahan Pengecualian Jawa: Apakah Anda Menangani Mereka Dengan Benar?Pengecualian dalam pemrograman menandakan kondisi luar biasa dalam pelaksanaan program. Ini digunakan ketika kondisi dapat ditangani dengan lebih baik di tempat lain. Pertimbangkan contoh penanganan Java yang berikut. Baca lebih banyak .

Berikut ini adalah jejak tumpukan khas, yang diperoleh dari objek pengecualian saat ditangkap.

Pengecualian di utas "utama" java.lang. IndexOutOfBoundsException: Indeks: 8, Ukuran: 5 di java.util. ArrayList.rangeCheck (ArrayList.java: 653) di java.util. ArrayList.get (ArrayList.java: 429) di sample.sample1.main (sample1.java: 24)

Pengecualian yang ditangkap di sini adalah IndexOutOfBoundsException. Ini termasuk informasi tambahan tentang kesalahan. Jejak tumpukan berisi 3 bingkai tumpukan, yang masing-masing berisi informasi lokasi seperti yang ditunjukkan.

Menangani Pengecualian

Pengecualian dapat ditangani dengan menangkapnya dalam coba tangkap memblokir dan mengambil tindakan korektif apa pun yang diperlukan. Itu Pengecualian objek menyediakan beberapa metode untuk mengekstraksi informasi tentang kondisi yang menyebabkannya.

Kode berikut mencatat pesan kesalahan ke file log.

void pribadi loadConfig () {coba {// kode panggilan yang mungkin menghasilkan tangkapan IOException} (java.io. IOException ex) {// menangani pengecualian di sini. Mungkin masuk ke file log. log.warning (ex.getMessage ()); } }

Saat pengecualian dimasukkan ke dalam yang lain, Anda dapat mengambil pengecualian yang dibungkus:

Penyebab Throwable = ex.getCause (); log.warning ("Penyebab mendasar:" + penyebab.getMessage ()); 

Apakah Anda perlu mengakses jejak stack, dan mungkin mengekstrak nama metode yang menyebabkannya?

StringBuilder sbuf = new StringBuilder ("Stack Trace:"); untuk (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.warning (sbuf.toString ());

Atau mungkin, catat pengecualian dan kembalikan?

coba {... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); lempar mantan; }

Itu Pengecualian kelas menyediakan a printStackTrace () metode yang dapat mencetak jejak stack ke Anda sendiri PrintStream (atau PrintWriter).

coba {... } catch (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (keluar); }

Anda dapat menangkap beberapa jenis pengecualian dalam satu mencoba memblokir, dan melakukan penanganan khusus untuk setiap jenis pengecualian.

coba {// berikan beberapa pengecualian di sini. } catch (java.io. IOException ex) {// IOException khusus menangani di sini. } catch (java.sql. SQLException ex) {// SQLException penanganan khusus di sini. }

Untuk menangkap beberapa jenis pengecualian tetapi menggunakan kode penanganan yang sama, Anda dapat mendeklarasikan a menangkap blokir dengan beberapa tipe sebagai berikut:

coba {// berikan beberapa pengecualian di sini. } catch (java.io. IOException | java.sql. SQLException ex) {// IOException dan penanganan khusus SQLException di sini. } catch (ex SAXException) {// penanganan khusus SAXException di sini. }

Membersihkan Sumber Daya Dengan Akhirnya

Ketika berhadapan dengan kode yang dapat membuang pengecualian, penting untuk melakukan pembersihan sumber daya yang tepat, seperti file yang dibuka Segala sesuatu yang perlu Anda ketahui tentang format file dan propertinyaKami menggunakan file kata secara bergantian: musik, gambar, spreadsheet, rangkai salindia, dan sebagainya. Tapi apa yang membuat file menjadi "file"? Mari kita coba dan pahami bagian dasar komputasi ini. Baca lebih banyak , koneksi basis data, dll. Pembersihan sumber daya harus dilakukan dalam akhirnya blok. Dengan cara ini baik keluar normal dan keluar luar biasa dari blok memanggil kode pembersihan 10 Kesalahan Pemrograman Terburuk dalam SejarahDi masa lalu yang bertingkat, kode kerusakan tempa juga. Contoh sedikit kode buruk menyebabkan bencana pada tingkat utama. Berikut ini adalah 10 kesalahan pemrograman terburuk dalam sejarah. Baca lebih banyak .

InputStream dalam = null; coba {... di = FileInputStream (nama file) baru;... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); } akhirnya {// kode di sini dieksekusi saat keluar dari blok try, // apakah normal atau karena pengecualian if (in! = null) in.close (); }

Blok Try-With-Resources

Java 1.7 memperkenalkan coba dengan sumber daya membangun yang membuat pembersihan sumber daya lebih mudah. Ini terlihat seperti ini:

coba (InputStream in = new FileInputStream (..)) {// kode yang menggunakan InputStream. }

Ketika kode keluar dari blok (apakah bersih atau karena pengecualian), kode InputStream variabel secara otomatis dibersihkan.

Bersihkan banyak sumber daya dengan mendeklarasikan semuanya di kepala blok.

coba (InputStream in = FileInputStream baru (..); Koneksi con =...; ) {// kode yang menggunakan InputStream dan Koneksi. }

Objek apa pun yang kelasnya mengimplementasikan Dapat Ditutup Otomatis antarmuka dapat dibersihkan dengan cara ini. Kelas berikut melakukan beberapa pembersihan khusus di Menutup() metode.

MyClass kelas publik mengimplementasikan AutoCloseable {public void close () {// kode pembersihan di sini} }

Gunakan instance dari kelas ini dalam a coba dengan sumber daya blok.

coba (MyClass obj = new MyClass (..)) {// kode yang menggunakan objek MyClass. }

Beberapa Pengecualian yang Biasanya Ditemui

Mari kita lihat beberapa pengecualian yang biasa kita temui.

  • IndexOutOfBoundsException (tidak dicentang): menunjukkan indeks elemen yang diakses berada di luar batas array, string, dll.
  • SQLException (dicentang): dilempar karena kesalahan basis data.
  • IOException (dicentang): kesalahan akses file atau kesalahan yang berkaitan dengan input dan output.
  • InterruptedException (dicentang): dilemparkan ketika eksekusi utas terganggu.
  • SAXException (dicentang): dilempar karena kesalahan parsing XML.
  • NullPointerException (tidak dicentang): menggunakan null di mana objek diperlukan.

Membungkus

Pengecualian adalah metode utama untuk pelaporan kesalahan dan manajemen di Jawa. Penggunaan pengecualian yang tepat meningkatkan kualitas kode Tulis atau Kode Lebih Cepat di Editor Teks Linux Anda Dengan Tema KhususEditor teks Linux Anda tidak harus terlihat menjemukan dan "fungsional." Mengapa tidak mengubahnya untuk meningkatkan produktivitas Anda, baik itu scripting dan coding atau menggunakan alat sebagai editor markup? Baca lebih banyak dan membantu dalam menyelesaikan masalah dalam produksi.

Apakah Anda memiliki kisah perang terkait pengecualian untuk dihubungkan? Jika demikian, beri tahu kami di bagian komentar di bawah.

Kredit Gambar: Dmitry Nikolaev via Shutterstock.com