Cara Menangani Pengecualian Java dengan Cara yang Benar

Cara Menangani Pengecualian Java dengan Cara yang Benar

Sebagai pemula pemrograman, konsep penanganan pengecualian bisa sulit untuk membungkus kepala Anda. Bukan berarti konsep itu sendiri sulit, tetapi terminologinya bisa membuatnya tampak lebih maju dari itu. Dan itu adalah fitur yang sangat kuat sehingga rentan disalahgunakan dan disalahgunakan.





Dalam artikel ini, Anda akan mempelajari apa itu pengecualian, mengapa itu penting, bagaimana menggunakannya, dan kesalahan umum yang harus dihindari. Sebagian besar bahasa modern memiliki semacam penanganan pengecualian, jadi jika Anda pernah pindah dari Java , Anda dapat membawa sebagian besar kiat ini.





Memahami Pengecualian Java

Di Jawa, pengecualian adalah objek yang menunjukkan sesuatu yang tidak normal (atau 'luar biasa') terjadi selama aplikasi Anda dijalankan. Pengecualian seperti itu adalah dilempar , yang pada dasarnya berarti objek pengecualian dibuat (mirip dengan bagaimana kesalahan 'dibesarkan').





Keindahannya adalah kamu bisa menangkap dilemparkan pengecualian, yang memungkinkan Anda menangani kondisi abnormal dan memungkinkan aplikasi Anda untuk terus berjalan seolah-olah tidak ada yang salah. Misalnya, sementara penunjuk nol di C mungkin membuat aplikasi Anda mogok, Java memungkinkan Anda melempar dan menangkap

NullPointerException

s sebelum variabel null memiliki peluang untuk menyebabkan crash.



Ingat, pengecualian hanyalah sebuah objek, tetapi dengan satu karakteristik penting: pengecualian harus diperluas dari

Exception

kelas atau subkelas dari





Exception

. Meskipun Java memiliki semua jenis pengecualian bawaan, Anda juga dapat membuatnya sendiri jika diinginkan. Beberapa dari pengecualian Java yang paling umum termasuk:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Jadi apa yang terjadi ketika Anda melempar pengecualian?





Pertama, Java melihat ke dalam metode langsung untuk melihat apakah ada kode yang menangani jenis pengecualian yang Anda lempar. Jika handler tidak ada, ia melihat metode yang memanggil metode saat ini untuk melihat apakah ada handle di sana. Jika tidak, itu terlihat pada metode yang disebut itu metode, dan kemudian metode berikutnya, dll. Jika pengecualian tidak tertangkap, aplikasi akan mencetak jejak tumpukan dan kemudian lumpuh. (Sebenarnya ini lebih bernuansa daripada sekadar mogok, tapi itu topik lanjutan di luar cakupan artikel ini.)

KE jejak tumpukan adalah daftar semua metode yang dilalui Java saat mencari penangan pengecualian. Inilah yang terlihat seperti jejak tumpukan:

Exception in thread 'main' java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Banyak hal yang bisa kita petik dari sini. Pertama, pengecualian yang dilemparkan adalah

NullPointerException

. Itu terjadi di

getTitle()

metode pada baris 16 dari Book.java. Metode itu dipanggil dari

getBookTitles()

pada baris 25 dari Author.java. Itu metode dipanggil dari

main()

pada baris 14 dari Bootstrap.java. Seperti yang Anda lihat, mengetahui semua ini membuat debugging lebih mudah.

Tetapi sekali lagi, manfaat sebenarnya dari pengecualian adalah Anda dapat 'menangani' kondisi abnormal dengan menangkap pengecualian, mengatur semuanya dengan benar, dan melanjutkan aplikasi tanpa mogok.

Menggunakan Pengecualian Java dalam Kode

Katakanlah Anda punya

someMethod()

yang mengambil bilangan bulat dan mengeksekusi beberapa logika yang dapat rusak jika bilangan bulat kurang dari 0 atau lebih besar dari 100. Ini bisa menjadi tempat yang baik untuk melempar pengecualian:

pemulihan sistem tidak berfungsi windows 7
public void someMethod(int value) {
if (value 100) {
throw new
IllegalArgumentException

Untuk menangkap pengecualian ini, Anda harus pergi ke mana

someMethod()

dipanggil dan menggunakan blok coba-tangkap :

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
}
// ...
}

Segala sesuatu di dalam mencoba blok akan dieksekusi secara berurutan sampai pengecualian dilemparkan. Segera setelah pengecualian dilemparkan, semua pernyataan berikutnya dilewati dan logika aplikasi segera melompat ke menangkap memblokir.

Dalam contoh kami, kami memasuki blok coba dan segera memanggil

someMethod()

. Karena 200 bukan antara 0 dan 100, an

IllegalArgumentException

dilempar. Ini segera mengakhiri eksekusi

someMethod()

, melewatkan sisa logika di blok try (

someOtherMethod()

tidak pernah dipanggil), dan melanjutkan eksekusi di dalam blok catch.

Apa yang akan terjadi jika kita memanggil

someMethod(50)

sebagai gantinya? NS

IllegalArgumentException

tidak akan pernah dibuang.

someMethod()

akan mengeksekusi seperti biasa. Blok try akan dijalankan seperti biasa, memanggil

someOtherMethod()

ketika someMethod() selesai. Kapan

someOtherMethod()

berakhir, blok tangkapan akan dilewati dan

callingMethod()

akan melanjutkan.

Perhatikan bahwa Anda dapat memiliki beberapa blok tangkap per blok coba:

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
} catch (NullPointerException e) {
// handle the exception in here
}
// ...
}

Perhatikan juga bahwa opsional akhirnya blok juga ada:

public void method() {
try {
// ...
} catch (Exception e) {
// ...
} finally {
// ...
}
}

Kode di dalam blok akhirnya adalah selalu dieksekusi tidak peduli apa. Jika Anda memiliki pernyataan kembali di blok coba, blok akhirnya dieksekusi sebelum kembali keluar dari metode. Jika Anda melempar pengecualian lain di blok tangkap, blok akhirnya dieksekusi sebelum pengecualian dilempar.

Anda harus menggunakan blok terakhir ketika Anda memiliki objek yang perlu dibersihkan sebelum metode berakhir. Misalnya, jika Anda membuka file di blok coba dan kemudian melemparkan pengecualian, blok akhirnya memungkinkan Anda menutup file sebelum meninggalkan metode.

Perhatikan bahwa Anda dapat memiliki blok akhirnya tanpa blok tangkap:

public void method() {
try {
// ...
} finally {
// ...
}
}

Ini memungkinkan Anda melakukan pembersihan yang diperlukan sambil mengizinkan pengecualian yang dilemparkan untuk menyebarkan tumpukan pemanggilan metode (yaitu Anda tidak ingin menangani pengecualian di sini tetapi Anda masih perlu membersihkan terlebih dahulu).

Pengecualian yang Dicentang vs. Tidak Dicentang di Java

Tidak seperti kebanyakan bahasa, Java membedakan antara pengecualian yang diperiksa dan pengecualian yang tidak dicentang (mis. C# hanya memiliki pengecualian yang tidak dicentang). Pengecualian yang dicentang harus ditangkap dalam metode di mana pengecualian dilemparkan atau kode tidak akan dikompilasi.

Untuk membuat pengecualian yang dicentang, perpanjang dari

Exception

. Untuk membuat pengecualian yang tidak dicentang, perpanjang dari

RuntimeException

.

Metode apa pun yang melempar pengecualian yang dicentang harus menunjukkan ini dalam tanda tangan metode menggunakan melempar kata kunci. Sejak Java built-in

IOException

adalah pengecualian yang dicentang, kode berikut tidak akan dikompilasi:

public void wontCompile() {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Anda harus terlebih dahulu mendeklarasikan bahwa itu melempar pengecualian yang dicentang:

public void willCompile() throws IOException {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Perhatikan bahwa suatu metode dapat dideklarasikan sebagai melempar pengecualian tetapi tidak pernah benar-benar melempar pengecualian. Meski begitu, pengecualian masih perlu ditangkap atau kode tidak akan dikompilasi.

Kapan Anda harus menggunakan pengecualian yang dicentang atau tidak dicentang?

Dokumentasi resmi Java memiliki halaman pada pertanyaan ini . Ini meringkas perbedaan dengan aturan praktis yang ringkas: 'Jika klien dapat diharapkan untuk pulih dari pengecualian, buat pengecualian yang diperiksa. Jika klien tidak dapat melakukan apa pun untuk memulihkan dari pengecualian, buat pengecualian yang tidak dicentang.'

Tetapi pedoman ini mungkin sudah ketinggalan zaman. Di satu sisi, pengecualian yang diperiksa menghasilkan kode yang lebih kuat . Di sisi lain, tidak ada bahasa lain yang memeriksa pengecualian dengan cara yang sama seperti Java, yang menunjukkan dua hal: satu, fitur tersebut tidak cukup berguna untuk dicuri oleh bahasa lain, dan dua, Anda benar-benar dapat hidup tanpanya. Plus, pengecualian yang dicentang tidak cocok dengan ekspresi lambda yang diperkenalkan di Java 8.

Pedoman Penggunaan Pengecualian Java

Pengecualian berguna tetapi mudah disalahgunakan dan disalahgunakan. Berikut adalah beberapa tip dan praktik terbaik untuk membantu Anda menghindari membuatnya berantakan.

  • Lebih suka pengecualian khusus daripada pengecualian umum. Gunakan |_+_| lebih |_+_| jika memungkinkan, jika tidak gunakan |_+_| lebih |_+_| bila memungkinkan.
  • Jangan pernah menangkap |_+_| ! |_+_| kelas sebenarnya meluas |_+_| , dan blok catch benar-benar berfungsi dengan |_+_| atau kelas apa pun yang memperluas Throwable. Namun, |_+_| kelas juga diperluas |_+_| , dan Anda tidak akan pernah ingin menangkap |_+_| karena |_+_| s menunjukkan masalah serius yang tidak dapat dipulihkan.
  • Jangan pernah menangkap |_+_| ! |_+_| memanjang |_+_| , jadi setiap blok yang menangkap |_+_| juga akan menangkap |_+_| , dan itu adalah pengecualian yang sangat penting yang tidak ingin Anda ganggu (terutama dalam aplikasi multi-utas) kecuali Anda tahu apa yang Anda lakukan. Jika Anda tidak tahu pengecualian mana yang harus ditangkap, pertimbangkan untuk tidak menangkap apa pun.
  • Gunakan pesan deskriptif untuk memudahkan debugging. Saat Anda melempar pengecualian, Anda dapat memberikan |_+_| pesan sebagai argumen. Pesan ini dapat diakses di blok tangkap menggunakan |_+_| metode, tetapi jika pengecualian tidak pernah ditangkap, pesan juga akan muncul sebagai bagian dari jejak tumpukan.
  • Cobalah untuk tidak menangkap dan mengabaikan pengecualian. Untuk mengatasi ketidaknyamanan pengecualian yang diperiksa, banyak programmer pemula dan malas akan menyiapkan blok tangkap tetapi membiarkannya kosong. Buruk! Selalu tangani dengan anggun, tetapi jika Anda tidak bisa, setidaknya cetak jejak tumpukan sehingga Anda tahu pengecualian telah dilemparkan. Anda dapat melakukannya menggunakan |_+_| metode.
  • Waspadalah terhadap pengecualian yang berlebihan. Ketika Anda memiliki palu, semuanya tampak seperti paku. Saat pertama kali belajar tentang pengecualian, Anda mungkin merasa berkewajiban untuk mengubah semuanya menjadi pengecualian... sampai pada titik di mana sebagian besar aliran kontrol aplikasi Anda turun ke penanganan pengecualian. Ingat, pengecualian dimaksudkan untuk kejadian 'luar biasa'!

Sekarang Anda harus cukup nyaman dengan pengecualian untuk memahami apa itu, mengapa mereka digunakan, dan bagaimana memasukkannya ke dalam kode Anda sendiri. Jika Anda tidak sepenuhnya memahami konsepnya, tidak apa-apa! Butuh beberapa saat untuk 'klik' di kepalaku, jadi jangan merasa kamu perlu terburu-buru. Gunakan waktumu.

Ada pertanyaan? Tahu ada tip terkait pengecualian lain yang saya lewatkan? Bagikan di komentar di bawah!

Membagikan Membagikan Menciak Surel Cara Membuat Diagram Aliran Data untuk Memvisualisasikan Data Proyek Apa Pun

Diagram aliran data (DFD) dari setiap proses membantu Anda memahami bagaimana data mengalir dari sumber ke tujuan. Berikut cara membuatnya!

Baca Selanjutnya
Topik-topik yang berkaitan
  • Pemrograman
  • Jawa
Tentang Penulis Joel lee(1524 Artikel Diterbitkan)

Joel Lee adalah Pemimpin Redaksi MakeUseOf sejak 2018. Dia memiliki gelar B.S. dalam Ilmu Komputer dan lebih dari sembilan tahun pengalaman menulis dan mengedit profesional.

cara mengekstrak gambar dari pdf
More From Joel Lee

Berlangganan newsletter kami

Bergabunglah dengan buletin kami untuk kiat teknologi, ulasan, ebook gratis, dan penawaran eksklusif!

Klik di sini untuk berlangganan