1. Kivételek
>
Végre a programozók arra gondoltak, hogy szabványosítják és automatizálják a hibakezelést. Ez akkor történt, amikor a kivételeket kitalálták. Most a kivételes mechanizmus kezeli a kivételes helyzetek 80%-át.
Ha néhány tudós kivételeket talált, az valószínűleg a doktori disszertációjának tárgya volt. Ha egy programozó találta ki, akkor lehet, hogy egy baráti vállveregetést kapott egy munkatársától: "Úgy tűnik, rendben van, tesó."
Ha hiba történik egy Java programban, például osztás -val 0
, néhány csodálatos dolog történik:
Első lépés
Létrejön egy speciális kivételobjektum, amely információkat tartalmaz a felmerült hibáról.
A Java-ban minden objektum, és a kivételek nem kivételek 🙂 A kivételobjektumoknak saját osztályaik vannak, és az egyetlen dolog, ami megkülönbözteti őket a szokásos osztályoktól, az az, hogy öröklik az osztályt Throwable
.
Második lépés
A kivétel objektum "dobott". Talán itt a megfogalmazás jobb lenne. A „kivételt dobni” inkább tűzriadó kiváltása vagy „DEFCON 1” riasztás megszólaltatása.
Amikor kivételt dob a Java gép, a program normál működése leáll, és megkezdődnek a "vészprotokollok".
Harmadik lépés
Azonnal kilép az a módszer, amellyel a kivételt dobták. A kivételt a hívó metódus kapja, amely szintén azonnal kilép. És így tovább a láncon, amíg a main
módszer ki nem lép. Amikor a main
metódus véget ér, a program is lejár.
Példa:
Kód | Konzol kimenet |
---|---|
|
|
Kivétel történik a 20. sorban: osztás 0-val. A Java gép azonnal létrehoz egy kivételt – egy ArithmeticException
objektumot, és „eldobja” a metódusnak.
A divide()
metódus azonnal véget ér, így soha nem látjuk a karakterláncot: Nem történt semmi szörnyű: 0. A program visszatér a metódushoz endTheWorld()
, és a helyzet megismétlődik: van egy kezeletlen kivétel a rendszerben, ami azt jelenti, hogy a endTheWorld()
metódus is rendellenesen leáll. Ezután a main
metódus leáll, és a program leáll.
Mi a célja ezeknek a kivételeknek? Nos, megírhatja saját kódját, hogy felfogjon bizonyos típusú kivételeket , és saját logikát írhat a kivételes helyzetek kezelésére.
2. Kivételek:try-catch
A Java rendelkezik egy kivételfogó mechanizmussal, amely lehetővé teszi a metódusok e rendellenes leállásának leállítását. Ez így néz ki:
try
{
// Code where an exception might occur
}
catch(ExceptionType name)
{
// Exception handling code
}
Ezt a konstrukciót blokknak nevezzük try-catch
.
A kivételek előfordulásának kódja kapcsos zárójelekbe van foglalva, a szó előtt try
.
A kapcsos kapcsos zárójelek után van a catch
kulcsszó és zárójelben a kivételváltozó deklarációja . Ezt a kapcsos zárójelek követik , amelyek a végrehajtandó kódot tördelik, ha a megadott típusú kivétel előfordul .
Ha az " elsődleges kód " végrehajtása során nem adnak kivételt , akkor a catch blokkon belüli kód nem kerül végrehajtásra. Ha kivétel történik, akkor az is lesz (ha a kidobott kivétel típusa megegyezik a zárójelben lévő változó típusával).
Példa:
Kód | Konzol kimenet |
---|---|
|
|
3. Több catch
blokk
Elméletileg mindenféle kivételt be lehet dobni egy kódblokkba. Vannak, akikkel így, másokkal másképp akarsz majd foglalkozni, mások pedig úgy döntesz, hogy egyáltalán nem.
A Java fejlesztők úgy döntöttek, hogy segítenek Önnek, és hagyják, hogy ne egy, hanem több blokkot írjon a blokk catch
után .try
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
}
Példa:
Kód | Konzol kimenet |
---|---|
|
|
catch
4. A blokkok sorrendje
A blokkban előforduló kivételeket try
csak egyetlen catch
blokk tudja elkapni. Nem lehet olyan kivételkezelési helyzet, amikor több blokkból származó kód catch
végrehajtásra kerül.
De a blokkok sorrendje számít.
Előfordulhat olyan helyzet, amikor egy kivételt több blokk is elkaphat. Ha ez a helyzet, akkor a kivételt az fogja elkapni, amelyik fogási blokk előbb érkezik (a blokkhoz legközelebb try
).
Hogyan fordulhat elő olyan helyzet, amikor több fogási blokk is elkaphatja ugyanazt a kivételt?
Minden kivétel egyetlen öröklődési hierarchiához tartozik – lásd a diagramot.
Egy ArithmeticException
objektum hozzárendelhető egy változóhoz, amelynek típusa ArithmeticException
vagy valamelyik ősosztálya: RuntimeException
, Exception
és Throwable
— lásd a diagramot.
A 21. szinten többet fogunk beszélni az öröklődésről és az ősök osztályairól.
Ez a kód jól lefordítható:
Az öröklés előnyei: |
---|
|
ArithmeticException
Így a fenti 4 blokk bármelyikével elkaphat egyet catch
.
1. példa:
Kód | Konzol kimenet |
---|---|
|
|
Ebben a példában a és a blokkok ArithmeticException
is elkaphatják . A blokkhoz legközelebb eső blokk fogja el – az első blokk.catch (Exception e)
catch (ArithmeticException e)
try
catch
A meglepetések elkerülése érdekében a legjobb, ha a blokkok listájának végéhez közelcatch
helyezi el azokat a blokkokat, amelyek szinte minden kivételt meg tudnak fogni .catch
A Throwable
típus általában képes minden lehetséges kivételt elkapni a Java-ban . Ha az első blokkba teszed catch
, akkor a kód nem fordul le, mivel a fordító tudja, hogy vannak elérhetetlen kódblokkok.