1. Pengecualian
>
Akhirnya, pemrogram berpikir untuk membakukan dan mengotomatiskan penanganan kesalahan. Ini terjadi ketika pengecualian ditemukan. Sekarang mekanisme pengecualian menangani 80% situasi luar biasa.
Jika beberapa sarjana muncul dengan pengecualian, kemungkinan itu adalah subjek dari disertasi doktoralnya. Jika seorang programmer datang dengan itu, maka dia mungkin telah menerima tepukan ramah dari seorang rekan kerja: "Sepertinya baik-baik saja, bro."
Saat terjadi kesalahan dalam program Java, seperti pembagian dengan 0
, beberapa hal menakjubkan terjadi:
Langkah pertama
Objek pengecualian khusus dibuat, yang berisi informasi tentang kesalahan yang terjadi.
Segala sesuatu di Jawa adalah objek, dan pengecualian bukanlah pengecualian 🙂 Objek pengecualian memiliki kelasnya sendiri, dan satu-satunya hal yang membedakannya dari kelas biasa adalah bahwa mereka mewarisi kelas tersebut Throwable
.
Langkah kedua
Objek pengecualian "dilempar". Mungkin kata-kata di sini bisa lebih baik. "Melempar pengecualian" lebih seperti memicu alarm kebakaran atau membunyikan peringatan "DEFCON 1".
Ketika pengecualian dilemparkan ke mesin Java, operasi normal dari program berhenti dan "protokol darurat" dimulai.
Langkah ketiga
Metode di mana pengecualian dilemparkan segera keluar. Pengecualian diteruskan ke metode pemanggilan, yang juga segera keluar. Dan seterusnya sampai main
metode keluar. Ketika main
metode berakhir, begitu pula programnya.
Contoh:
Kode | Keluaran konsol |
---|---|
|
|
Pengecualian terjadi pada baris 20: pembagian dengan 0. Mesin Java segera membuat pengecualian — ArithmeticException
objek dan "melempar" ke metode.
Metode divide()
segera berakhir, jadi kita tidak pernah melihat string: Tidak ada hal buruk yang terjadi: 0. Program kembali ke metode endTheWorld()
, dan situasi berulang: ada pengecualian yang tidak tertangani dalam sistem, yang berarti bahwa metode endTheWorld()
juga berhenti secara tidak normal. Kemudian main
metode berakhir, dan program berhenti.
Apa tujuan dari pengecualian ini? Nah, Anda dapat menulis kode Anda sendiri untuk menangkap jenis pengecualian tertentu dan menulis logika Anda sendiri untuk menangani situasi luar biasa.
2. Menangkap pengecualian:try-catch
Java memiliki mekanisme penangkapan pengecualian yang memungkinkan Anda menghentikan penghentian metode yang tidak normal ini. Ini terlihat seperti ini:
try
{
// Code where an exception might occur
}
catch(ExceptionType name)
{
// Exception handling code
}
Konstruksi ini disebut try-catch
blok.
Kode di mana pengecualian dapat terjadi dibungkus dengan kurung kurawal, diawali dengan kata try
.
Setelah kurung kurawal, kita memiliki catch
kata kunci dan, di dalam tanda kurung, deklarasi variabel pengecualian . Ini diikuti oleh kurung kurawal yang membungkus kode yang akan dieksekusi jika terjadi pengecualian dari jenis yang ditentukan .
Jika tidak ada pengecualian yang dilemparkan selama eksekusi " kode utama ", maka kode di dalam blok catch tidak akan dieksekusi. Jika pengecualian terjadi, maka itu akan menjadi (jika jenis pengecualian yang dilemparkan sama dengan jenis variabel dalam tanda kurung).
Contoh:
Kode | Keluaran konsol |
---|---|
|
|
3. Beberapa catch
blok
Secara teori, segala macam pengecualian dapat dimasukkan ke dalam blok kode. Beberapa ingin Anda tangani dengan satu cara, yang lain dengan cara lain, dan yang lainnya Anda akan memutuskan untuk tidak menangani sama sekali.
Pengembang Java memutuskan untuk membantu Anda dan membiarkan Anda menulis bukan hanya satu tetapi banyak catch
blok setelah try
blok.
try
{
// Code where an exception might occur
}
catch (ExceptionType1 name1)
{
// Code for handling ExceptionType1
}
catch (ExceptionType2 name2)
{
// Code for handling ExceptionType2
}
catch (ExceptionType3 name3)
{
// Code for handling ExceptionType3
}
Contoh:
Kode | Keluaran konsol |
---|---|
|
|
4. Urutan catch
blok
Pengecualian yang terjadi dalam satu try
blok hanya dapat ditangkap oleh satu catch
blok. Anda tidak dapat memiliki situasi penanganan pengecualian di mana kode dari banyak catch
blok dieksekusi.
Tapi urutan blok itu penting.
Anda dapat memiliki situasi di mana pengecualian dapat ditangkap oleh banyak blok. Jika itu masalahnya, maka pengecualian akan ditangkap oleh blok tangkap mana pun yang lebih dulu (paling dekat dengan try
blok).
Bagaimana Anda bisa mengalami situasi di mana banyak blok tangkapan dapat menangkap pengecualian yang sama?
Semua pengecualian termasuk dalam hierarki pewarisan tunggal — lihat diagram.
Sebuah ArithmeticException
objek dapat ditugaskan ke variabel yang tipenya adalah ArithmeticException
atau salah satu dari kelas leluhurnya: RuntimeException
, Exception
dan Throwable
— lihat diagram.
Kita akan berbicara lebih banyak tentang warisan dan kelas leluhur di Level 21.
Kode ini akan dikompilasi dengan baik:
Manfaat warisan: |
---|
|
Jadi Anda bisa menangkapnya ArithmeticException
dengan salah satu dari 4 catch
blok di atas.
Contoh 1:
Kode | Keluaran konsol |
---|---|
|
|
Dalam contoh ini, ArithmeticException
dapat ditangkap oleh blok catch (Exception e)
dan catch (ArithmeticException e)
. Itu akan ditangkap oleh blok yang paling dekat dengan try
blok — blok pertama catch
.
Untuk menghindari kejutan, yang terbaik adalah menempatkan catch
blok yang dapat menangkap hampir setiap pengecualian di dekat akhir daftar catch
blok.
Jenis Throwable
umumnya mampu menangkap setiap kemungkinan pengecualian di Jawa . Jika Anda meletakkannya di catch
blok pertama, maka kode tidak akan dikompilasi, karena kompiler mengetahui bahwa ada blok kode yang tidak dapat dijangkau.
GO TO FULL VERSION