Mint programozó újonc, a koncepció kivételkezelés nehéz lehet a fejét körültekerni. Nem mintha maga a koncepció nehéz lenne, de a terminológia miatt fejlettebbnek tűnhet, mint amilyen. És ez olyan erős funkció, hogy hajlamos a visszaélésekre és visszaélésekre.
Ebben a cikkben megtudhatja, hogy mik a kivételek, miért fontosak, hogyan kell használni őket, és milyen gyakori hibákat kell elkerülni. A legtöbb modern nyelv rendelkezik valamiféle kivételkezeléssel, így ha valaha továbblép a Java -ról, a legtöbb tippet magával viheti.
A Java kivételek megértése
Java -ban egy kivétel olyan objektum, amely azt jelzi, hogy valami rendellenes (vagy „kivételes”) történt az alkalmazás futtatása során. Ilyen kivételek dobott , ami alapvetően azt jelenti, hogy kivételi objektum jön létre (hasonlóan a hibák „felvetéséhez”).
A szépség az, hogy képes vagy rá fogás kivételeket dobott, ami lehetővé teszi a rendellenes állapot kezelését, és lehetővé teszi az alkalmazás futását, mintha semmi baja nem esne. Például, míg egy C nullmutató összeomolhatja az alkalmazást, a Java lehetővé teszi a dobást és a fogást
NullPointerException
s mielőtt egy null változónak esélye lenne összeomlást okozni.
Ne feledje, a kivétel csak egy objektum, de van egy fontos jellemzője: ki kell terjeszteni a
Exception
osztály vagy bármely alosztálya
Exception
. Bár a Java mindenféle beépített kivételt tartalmaz, saját is létrehozhat, ha akar. Néhány leggyakoribb Java kivételek tartalmazza:
NullPointerException
NumberFormatException
IllegalArgumentException
RuntimeException
IllegalStateException
Tehát mi történik, ha kivételt teszel?
Először is, a Java megvizsgálja a közvetlen módszert, hogy lássa, van -e olyan kód, amely kezeli az Ön által kivett kivételt. Ha egy kezelő nem létezik, akkor az aktuális metódust hívó metódus alapján megvizsgálja, hogy létezik -e ott fogantyú. Ha nem, akkor megnézi a hívott módszert hogy módszer, majd a következő módszer stb. Ha a kivételt nem éri el, az alkalmazás kinyomtat egy verem nyomait, majd összeomlik. (Valójában árnyaltabb, mint egyszerűen összeomlik, de ez egy fejlett téma, amely túlmutat a cikk keretein.)
NAK NEK verem nyom az összes olyan módszer listája, amelyeken a Java végigment, miközben kivételkezelőt keresett. Így néz ki a verem nyoma:
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)
Ebből sokat le tudunk szedni. Először is, a dobott kivétel a
NullPointerException
. Az történt
getTitle()
módszer a Book.java 16. sorában. Ezt a módszert innen hívták
getBookTitles()
a Author.java 25. sorában. Hogy metódust hívták
main()
a Bootstrap.java 14. sorában. Mint látható, mindezek ismerete megkönnyíti a hibakeresést.
De a kivételek valódi előnye az, hogy a rendellenes állapotot úgy kezelheti, hogy elkapja a kivételt, helyreállítja a dolgokat, és összeomlás nélkül folytatja az alkalmazást.
Java kivételek használata a kódban
Tegyük fel, hogy van
someMethod()
amely egész számot vesz fel, és olyan logikát hajt végre, amely megszakadhat, ha az egész kisebb, mint 0 vagy nagyobb, mint 100. Ez egy jó hely a kivétel kivételére:
honnan tölthetek le ingyen zenét
public void someMethod(int value) {
if (value 100) {
throw new IllegalArgumentException
Ahhoz, hogy elkapja ezt a kivételt, el kell mennie hová
someMethod()
hívják és használja a try-catch blokk :
public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
}
// ...
}
Minden a próbáld ki blokk sorrendben fog végrehajtani, amíg kivételt nem dob. Amint kivételt dob, minden későbbi utasítást kihagy, és az alkalmazás logikája azonnal a fogás Blokk.
Példánkban belépünk a try blokkba és azonnal hívunk
someMethod()
. Mivel a 200 nem 0 és 100 között van, an
IllegalArgumentException
dobják. Ezzel azonnal véget ér a végrehajtása
someMethod()
, kihagyja a többi logikát a try blokkban (
someOtherMethod()
soha nem hívják meg), és folytatja a végrehajtást a fogási blokkon belül.
Mi történne, ha felhívnánk
someMethod(50)
helyette? Az
IllegalArgumentException
soha nem dobnák el.
someMethod()
normálisan hajtaná végre. A try blokk a szokásos módon, hívásként futna
someOtherMethod()
amikor a someMethod () befejeződik. Amikor
someOtherMethod()
véget ér, a fogási blokk kihagyásra kerül és
callingMethod()
folytatódna.
Ne feledje, hogy próbálkozási blokkonként több fogási blokk is lehet:
public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
} catch (NullPointerException e) {
// handle the exception in here
}
// ...
}
Azt is vegye figyelembe, hogy opcionális végül blokk is létezik:
public void method() {
try {
// ...
} catch (Exception e) {
// ...
} finally {
// ...
}
}
A végső blokkon belüli kód az mindig kivégezték bármit is. Ha van egy visszatérési utasítás a try blokkban, akkor a végső blokk végrehajtásra kerül, mielőtt visszatér a metódusból. Ha újabb kivételt dob a fogási blokkba, a végső blokk végrehajtódik, mielőtt a kivétel eldobásra kerül.
Az utolsó blokkot akkor kell használni, ha olyan objektumok vannak, amelyeket meg kell tisztítani a módszer befejezése előtt. Például, ha megnyitott egy fájlt a try blokkban, és később kivételt dobott, az utolsó blokk lehetővé teszi a fájl bezárását, mielőtt elhagyja a módszert.
Ne feledje, hogy végül blokkot kaphat fogási blokk nélkül:
public void method() {
try {
// ...
} finally {
// ...
}
}
Ez lehetővé teszi a szükséges tisztítást, miközben lehetővé teszi, hogy a kivetett kivételek továbbítsák a metódus meghívási veremét (azaz itt nem szeretné kezelni a kivételt, de először is tisztítania kell).
Ellenőrzött és nem jelölt kivételek a Java -ban
A legtöbb nyelvvel ellentétben a Java különbséget tesz ellenőrzött kivételek és ellenőrizetlen kivételek (pl. a C# csak ellenőrizetlen kivételeket tartalmaz). Ellenőrzött kivétel kell abban a metódusban, ahol a kivételt dobja, különben a kód nem lesz fordítva.
Ellenőrzött kivétel létrehozásához nyissa meg a következőt:
Exception
. Ellenőrizetlen kivétel létrehozásához nyissa meg a következőt:
RuntimeException
.
Bármely metódusnak, amely ellenőrzött kivételt dob, ezt meg kell jelölnie a metódus aláírásban a dob kulcsszó. Mivel a Java beépített
IOException
bejelölt kivétel, a következő kód nem lesz lefordítva:
public void wontCompile() {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}
Először ki kell jelentenie, hogy ellenőrzött kivételt eredményez:
public void willCompile() throws IOException {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}
Ne feledje, hogy egy módszer kivételt dobhat, de valójában soha nem dobhat kivételt. Ennek ellenére a kivételt továbbra is el kell fogni, különben a kód nem lesz lefordítva.
Mikor használjon ellenőrzött vagy nem ellenőrzött kivételeket?
A hivatalos Java dokumentáció a oldal ebben a kérdésben . Ez a különbség egy tömör ökölszabály szerint foglalható össze: „Ha ésszerűen elvárható, hogy az ügyfél felépüljön egy kivételből, tegye azt ellenőrzött kivételnek. Ha az ügyfél nem tud semmit tenni a kivételből való helyreállítás érdekében, tegye azt ellenőrizetlen kivételnek. '
De ez az útmutató elavult lehet. Egyrészt az ellenőrzött kivételek robusztusabb kódot eredményeznek. Másrészt egyetlen más nyelv sem ellenőrizte a kivételeket ugyanúgy, mint a Java, ami két dolgot mutat: egyrészt a funkció nem elég hasznos ahhoz, hogy más nyelvek ellopják, és kettő, ezek nélkül is élhet. Ráadásul az ellenőrzött kivételek nem játszanak szépen a Java 8 -ban bevezetett lambda kifejezésekkel.
Irányelvek a Java kivételek használatához
A kivételek hasznosak, de könnyen visszaélnek és visszaélnek. Íme néhány tipp és bevált gyakorlat, amelyek segítenek elkerülni a rendetlenséget.
- Előnyben részesítse a konkrét kivételeket az általános kivételekkel szemben. Használja | _+_ | vége | _+_ | ha lehetséges, különben használja | _+_ | vége | _+_ | amikor lehetséges.
- Soha ne fogd | _+_ | ! A | _+_ | osztály valójában kiterjed | _+_ | , és a fogási blokk ténylegesen működik a | _+_ | vagy bármely olyan osztály, amely kiterjeszti a Dobható -t. Azonban a | _+_ | osztály is kiterjed | _+_ | , és soha nem akar elkapni egy | _+_ | mert | _+_ | s súlyos helyrehozhatatlan problémákat jeleznek.
- Soha ne fogd | _+_ | ! | _+_ | kiterjed | _+_ | , tehát minden blokk, amely elkapja | _+_ | fog is | _+_ | , és ez egy nagyon fontos kivétel, amellyel nem akarsz összezavarodni (különösen többszálú alkalmazásokban), ha nem tudod, mit csinálsz. Ha nem tudja, melyik kivételt kell elkapnia, fontolja meg, hogy ne fogjon semmit.
- Használjon leíró üzeneteket a hibakeresés megkönnyítésére. Ha kivételt dob, megadhat egy | _+_ | üzenet érvként. Ez az üzenet a fogási blokkban érhető el a | _+_ | használatával módszer, de ha a kivételt soha nem sikerül elkapni, akkor az üzenet a veremkövetés részeként is megjelenik.
- Próbálja meg nem elkapni és figyelmen kívül hagyni a kivételeket. Az ellenőrzött kivételek okozta kellemetlenségek elkerülése érdekében sok kezdő és lusta programozó beállít egy fogási blokkot, de üresen hagyja. Rossz! Mindig kecsesen bánj vele, de ha nem tudod, legalább nyomd ki a verem nyomait, hogy tudd, a kivételt eldobták. Ezt a | _+_ | gombbal teheti meg módszer.
- Óvakodjon a kivételek túlzott használatától. Ha van kalapácsod, minden úgy néz ki, mint egy szög. Amikor először megtudja a kivételeket, úgy érezheti, kötelessége mindent kivételnek alakítani ... arra a pontra, ahol az alkalmazás vezérlőfolyamatainak nagy része a kivételkezelésre vonatkozik. Ne feledje, a kivételek a „kivételes” eseményekre vonatkoznak!
Most már elég kényelmesnek kell lennie a kivételekkel, hogy megértse, mik ezek, miért használják őket, és hogyan illessze be őket saját kódjába. Ha nem teljesen érted a fogalmat, akkor semmi baj! Beletelt egy kis időbe, mire „kattanni” kezdett a fejemben, úgyhogy ne érezd úgy, hogy el kell sietned. Nem kell kapkodni.
Van kérdése? Tud más kivételekkel kapcsolatos tippeket, amelyeket kihagytam? Ossza meg őket az alábbi megjegyzésekben!
Részvény Részvény Csipog Email Hogyan készítsünk adatáramlási diagramot bármely projekt adatainak megjelenítéséhez Bármely folyamat adatáramlási diagramjai (DFD) segítenek megérteni, hogyan folynak az adatok a forrásból a célállomásba. Így hozhat létre!
Olvassa tovább Kapcsolódó témák - Programozás
- Jáva
A szerzőről Joel Lee(1524 megjelent cikk) Joel Lee a MakeUseOf főszerkesztője 2018 óta. B.S. számítástechnika szakon és több mint kilenc éves szakmai írási és szerkesztési tapasztalat.
rajzoljon szimbólumot
Továbbiak Joel Lee -tőlIratkozzon fel hírlevelünkre
Csatlakozz hírlevelünkhöz, ahol technikai tippeket, értékeléseket, ingyenes e -könyveket és exkluzív ajánlatokat találsz!
Feliratkozáshoz kattintson ide