3. Burkolási kivételek
Az ellenőrzött kivételek elméletben menőnek tűntek, de a gyakorlatban óriási csalódásnak bizonyultak.
Tegyük fel, hogy van egy rendkívül népszerű módszer a projektjében. A programodban több száz helyről hívják. És úgy dönt, hogy hozzáad egy új ellenőrzött kivételt. És könnyen lehet, hogy ez az ellenőrzött kivétel valóban fontos és annyira különleges, hogy csak a main()
metódus tudja, mit kell tenni, ha elkapják.
Ez azt jelenti, hogy hozzá kell adnia a bejelölt kivételt throws
minden olyan metódus záradékához, amely a szupernépszerű metódusát hívja meg . Valamint throws
az összes olyan metódus záradékában, amely ezeket a metódusokat hívja. És azokról a módszerekről, amelyek ezeket a módszereket hívják.
Ennek eredményeként throws
a projektben a metódusok felének záradékai új ellenőrzött kivételt kapnak. És természetesen a projektjét tesztek fedik le, és most a tesztek nem fordítódnak le. És most szerkesztened kell a dobások záradékait is a tesztekben.
Ezután az összes kódot (a több száz fájlban lévő összes változást) más programozóknak át kell nézniük. És ezen a ponton feltesszük magunknak a kérdést, hogy miért hajtottunk végre annyi véres változtatást a projekten? Munkanap(ok) és hibás tesztek – mindez csak egy ellenőrzött kivétel hozzáadásának kedvéért ?
És természetesen továbbra is vannak problémák az örökléssel és a módszer felülbírálásával kapcsolatban. Az ellenőrzött kivételekből származó problémák sokkal nagyobbak, mint a haszon. A lényeg az, hogy ma már kevesen szeretik és kevesen használják.
Azonban még mindig sok olyan kód van (beleértve a szabványos Java könyvtári kódot is), amely ezeket az ellenőrzött kivételeket tartalmazza. Mi a teendő velük? Nem hagyhatjuk figyelmen kívül őket, és nem tudjuk, hogyan kezeljük őket.
A Java programozók azt javasolták, hogy az ellenőrzött kivételeket csomagolja be RuntimeException
. Más szóval, fogja meg az összes ellenőrzött kivételt, majd hozzon létre nem ellenőrzött kivételeket (például RuntimeException
), és dobja el őket. Ez valahogy így néz ki:
try
{
// Code where a checked exception might occur
}
catch(Exception exp)
{
throw new RuntimeException(exp);
}
Nem túl szép megoldás, de nincs itt semmi bűnöző: a kivételt egyszerűen egy RuntimeException
.
Ha szükséges, onnan könnyen visszakeresheti. Példa:
Kód | jegyzet |
---|---|
|
A kivétel tárolása az RuntimeException objektumon belül. A cause változó esetleg null Meghatározza a típusát, és konvertálja ellenőrzött kivételtípussá. |