1. Pengecualian
>
Akhirnya, pengaturcara berfikir untuk menyeragamkan dan mengautomasikan pengendalian ralat. Ini berlaku apabila pengecualian dicipta. Sekarang mekanisme pengecualian mengendalikan 80% situasi luar biasa.
Jika sesetengah sarjana mengemukakan pengecualian, ia mungkin subjek disertasi kedoktorannya. Jika seorang pengaturcara datang dengannya, maka dia mungkin telah menerima tepukan mesra di belakang daripada rakan sekerja: "Nampaknya okay, bro."
Apabila ralat berlaku dalam program Java, seperti pembahagian dengan 0
, beberapa perkara menarik berlaku:
Langkah satu
Objek pengecualian khas dicipta, yang mengandungi maklumat tentang ralat yang berlaku.
Segala-galanya dalam Java adalah objek, dan pengecualian tidak terkecuali 🙂 Objek pengecualian mempunyai kelas mereka sendiri, dan satu-satunya perkara yang membezakannya daripada kelas biasa ialah ia mewarisi kelas Throwable
.
Langkah kedua
Objek pengecualian ialah "dilemparkan". Mungkin kata-kata di sini boleh menjadi lebih baik. "Melemparkan pengecualian" lebih seperti mencetuskan penggera kebakaran atau membunyikan amaran "DEFCON 1".
Apabila pengecualian dilemparkan ke mesin Java, operasi biasa program berhenti dan "protokol kecemasan" bermula.
Langkah ketiga
Kaedah di mana pengecualian dilemparkan keluar serta-merta. Pengecualian diserahkan kepada kaedah panggilan, yang juga keluar serta-merta. Dan seterusnya ke bawah rantai sehingga main
kaedah keluar. Apabila main
kaedah ditamatkan, begitu juga program.
Contoh:
Kod | Output konsol |
---|---|
|
|
Pengecualian berlaku pada baris 20: pembahagian dengan 0. Mesin Java serta-merta mencipta pengecualian — ArithmeticException
objek dan "melemparkannya" ke kaedah.
Kaedah ini divide()
tamat serta-merta, jadi kita tidak pernah melihat rentetan: Tiada apa-apa yang mengerikan berlaku: 0. Program ini kembali kepada kaedah endTheWorld()
, dan keadaan berulang dengan sendirinya: terdapat pengecualian yang tidak dikendalikan dalam sistem, yang bermaksud bahawa endTheWorld()
kaedah itu juga ditamatkan secara tidak normal. Kemudian main
kaedah ditamatkan, dan program berhenti.
Apakah tujuan pengecualian ini? Nah, anda boleh menulis kod anda sendiri untuk menangkap jenis pengecualian tertentu dan menulis logik anda sendiri untuk mengendalikan situasi luar biasa.
2. Pengecualian menangkap:try-catch
Java mempunyai mekanisme penangkapan pengecualian yang membolehkan anda menghentikan penamatan kaedah yang tidak normal ini. Ia kelihatan seperti ini:
try
{
// Code where an exception might occur
}
catch(ExceptionType name)
{
// Exception handling code
}
Konstruk ini dipanggil try-catch
blok.
Kod di mana pengecualian mungkin berlaku dibalut dengan pendakap kerinting, didahului dengan perkataan try
.
Selepas kurungan kerinting, kami mempunyai catch
kata kunci dan, di dalam kurungan, pengisytiharan pembolehubah pengecualian . Ini diikuti oleh pendakap kerinting yang membalut kod untuk dilaksanakan jika pengecualian jenis yang ditentukan berlaku .
Jika tiada pengecualian dilemparkan semasa pelaksanaan " kod utama ", maka kod di dalam blok tangkapan tidak akan dilaksanakan. Jika pengecualian berlaku, maka ia akan menjadi (jika jenis pengecualian yang dilemparkan adalah sama dengan jenis pembolehubah dalam kurungan).
Contoh:
Kod | Output konsol |
---|---|
|
|
3. Berbilang catch
blok
Secara teori, semua jenis pengecualian boleh dilemparkan dalam blok kod. Sesetengah anda akan mahu mengendalikan satu cara, yang lain dengan cara lain, dan yang lain anda akan memutuskan untuk tidak mengendalikan sama sekali.
Pembangun Java memutuskan untuk membantu anda dan membenarkan anda menulis bukan satu tetapi banyak catch
blok selepas 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:
Kod | Output konsol |
---|---|
|
|
4. Susunan catch
blok
Pengecualian yang berlaku dalam try
blok hanya boleh ditangkap oleh satu catch
blok. Anda tidak boleh mempunyai situasi pengendalian pengecualian di mana kod daripada berbilang catch
blok dilaksanakan.
Tetapi susunan blok itu penting.
Anda boleh mengalami situasi di mana pengecualian boleh ditangkap oleh berbilang blok. Jika itu berlaku, maka pengecualian akan ditangkap oleh mana-mana blok tangkapantry
yang datang dahulu (paling hampir dengan blok).
Bagaimanakah anda boleh menghadapi situasi di mana berbilang blok tangkapan boleh menangkap pengecualian yang sama?
Semua pengecualian tergolong dalam hierarki warisan tunggal — lihat rajah.
Objek ArithmeticException
boleh diberikan kepada pembolehubah yang jenisnya ArithmeticException
atau mana-mana kelas moyangnya: RuntimeException
, Exception
dan Throwable
— lihat rajah.
Kita akan bercakap lebih lanjut tentang kelas warisan dan nenek moyang di Tahap 21.
Kod ini akan disusun dengan baik:
Faedah harta pusaka: |
---|
|
Jadi anda boleh menangkap ArithmeticException
dengan mana-mana 4 catch
blok di atas.
Contoh 1:
Kod | Output konsol |
---|---|
|
|
Dalam contoh ini, ArithmeticException
boleh ditangkap oleh kedua-dua catch (Exception e)
dan catch (ArithmeticException e)
blok. Ia akan ditangkap oleh blok yang paling hampir dengan try
blok - blok pertama catch
.
Untuk mengelakkan kejutan, sebaiknya letakkan catch
blok yang boleh menangkap hampir setiap pengecualian berhampiran penghujung senarai catch
blok.
Jenis ini Throwable
secara amnya mampu menangkap setiap pengecualian yang mungkin di Jawa . Jika anda meletakkannya dalam catch
blok pertama, maka kod itu tidak akan dikompil, kerana pengkompil mengetahui bahawa terdapat blok kod yang tidak boleh dicapai.
GO TO FULL VERSION