Hirdetés
A programozásban alkalmazott kivétel a program végrehajtásának bizonyos pontjain kivételes körülményt jelent. Arra használják, amikor a kivételes körülmények máshol jobban kezelhetők, nem pedig ott, ahol előfordulnak. Vegyük figyelembe a következő példákat:
- A konfigurációs fájl megnyitásának elmulasztása jobban kezelhető magasabb szintű kódban, esetleg egy alternatív konfigurációs fájl helyének használatával.
- Hozzáférés a tömb elem A Java ArrayList használataA Java tömblista egy általános célú átméretezhető tömb. Ez biztosítja a többség általánosságban elvárt szolgáltatások legtöbb nyelvét más nyelveken. Ebben a cikkben megtudhatja, hogyan állítson be és használjon egy masztilistát. Olvass tovább A tömb határain kívüli program hiba jelent. Boldog hibakeresést!
- Az XML elemzési hibát fel kell hívni a felhasználó figyelmére, hogy az XML fájl javítható legyen.
- A memória elfogyott programja (talán egy nagy fájl feldolgozásakor) kiküszöbölhető úgy, hogy növelheti a java folyamathoz rendelkezésre álló memória mennyiségét.
Mindezen esetekben (és még több esetben) a kivételt annak a helynek a keretein kívül kell kezelni, ahol a kiváltó ok megoldható.
Kivételek típusai
Az alábbi kép a Java kivételhierarchia fő részeit mutatja be. Az alap osztály Eldobható amely alosztályba tartozik Kivétel és Hiba. Osztály Kivétel a programhoz kapcsolódó feltételekhez kapcsolódik, amelyeket az alkalmazások elkaphatnak a helyzet megmentése céljából. Osztály Hibamásrészt olyan súlyos hibák jelzésére szolgál a Java Run-time környezetben, amelyeket az alkalmazásoknak nem szabad elkapniuk. Néhány példa a következőkre: OutOfMemoryError és StackOverflowError.
egy Kivétel ismét kétféle: ellenőrzött és nem ellenőrzött. Az ellenőrzött kivételt a hívószámnak kell kezelnie. Ezt a szabályt a java fordító hajtja végre. Egy nem ellenőrzött kivétel viszont továbbadható a hívási láncban anélkül, hogy azt kifejezetten be kellene jelentenie. Az alábbi példák világossá teszik.
Ellenőrzött kivételek
A következő módszer megkísérel létrehozni FileReader egy fájlból. A kivitelező ellenőrzött kivételt dob FileNotFoundException amelyet a hívó kóddal kell kezelni, vagy dobottnak kell nyilvánítani.
A következő kód: nem fordítsd, mivel egyik sem.
private void loadFile (karakterlánc fájlnév) {FileReader in = új FileReader (fájlnév); }
A kód lefordításának egyik módja a kivétel kezelése (lásd alább).
private void loadFile (karakterlánc fájlnév) {próbálja meg a {FileReader in = new FileReader (fájlnév)); {} fogás (FileNotFoundException ex) {// kivétel kezelése itt} }
Ha a kivételt a hívó fél közvetlenül nem tudja kezelni, akkor azt a módszer aláírásában be kell jelenteni.
private void loadFile (karakterlánc fájlnév) dobja a java.io fájlt. FileNotFoundException. {FileReader in = new FileReader (fájlnév)); { }
Nem jelölt kivételek
Egy nem ellenőrzött kivétel az, amely alosztályozott RuntimeException és ezeket nem kell közvetlenül kezelni vagy a fentiek szerint bejelenteni. Például a következő kód eredményeként a NullPointerException, amely egyfajta RuntimeException. A kód azonban hibátlanul fordul azóta NullPointerException nem ellenőrzött kivétel.
private void handleEvent () {String name = null; if (név.hossz ()> 0) {} }
Csomagolási kivételek
Tekintettel az ellenőrzött és nem ellenőrzött kivételekről szóló fenti vitára, úgy tűnik, hogy könnyebb kezelni a nem ellenőrzött kivételeket, mivel nem kell azokat bejelentenie vagy kezelnie. Ezt a kényelmet szem előtt tartva néha hasznos lehet egy ellenőrzött kivétel beillesztése egy nem ellenőrzött kivételbe.
A következő példa bemutatja, hogyan kell beilleszteni egy kivételt. A módszer, a metódus method_1 () dob egy SQLException a testében. A kód helyes összeállítása érdekében a kivételt visszavontnak kell nyilvánítani.
private void method_1 () eldobja az SQLException {... dobjon új SQLException; }
Ha ezt a módszert egy másik módszer hívja fel (method_2 ()), ez a módszer elkaphatja a SQLException és tekerje be egy nem ellenőrzött kivételbe, így nem kell deklarálnia a kivételt a módszer aláírásában.
private void method_2 () {próbálja meg {method_1 (); } fogás (java.sql. SQLException ex) {dobjon új RuntimeException (ex); } }
Kivétel Stack Trace
Egy kivételes veremkövetés az aktív veremkeretek tömbjére vonatkozik, amelyek mindegyike módszermeghívást képvisel, amelyet a JVM rögzített a kivétel dobásakor. Minden egyes kötegkeret tartalmazza a módszer meghívásának helyét, beleértve az osztály nevét, a módszer nevét és esetleg a fájlban található java forrásfájl nevét és sorszámát. Hasznos a hívások sorozatának visszakeresésére ez okozta a hibát Java kivételek: Jól kezeli őket?A programozásban alkalmazott kivétel a program végrehajtásának kivételes helyzetét jelenti. Arra használják, amikor a feltétel máshol is jobban kezelhető. Vegye figyelembe a Java kivételek kezelésének alábbi példáit. Olvass tovább .
Itt egy tipikus verem nyomkövetés, amelyet a kivételes objektumból kaptak, amikor elfogták.
Kivétel a "fő" szál java.lang részében. IndexOutOfBoundsException: Index: 8, Méret: 5 a java.util webhelyen. ArrayList.rangeCheck (ArrayList.java: 653) és java.util. ArrayList.get (ArrayList.java: 429) a sample.sample1.main (minta1.java: 24) oldalon.
Az itt elfogott kivétel az IndexOutOfBoundsException. További információkat tartalmaz a hibáról. A veremkövetés 3 veremkeretet tartalmaz, amelyek mindegyike tartalmazza az ábrán látható helyinformációkat.
Kivételek kezelése
Kivétel kezelhető úgy, hogy befogja a try-catch blokkolja és megteszi a szükséges javító intézkedéseket. Az Kivétel Az objektum számos módszert kínál információk kivonására az azt okozó állapotról.
A következő kód naplófájlba naplózza a hibaüzenetet.
private void loadConfig () {próbáljon {// hívószámot generálni, amely IOException} előállítást eredményezhet (java.io. IOException ex) {// itt kezeljük a kivételt. Lehet naplózni egy naplófájlba. log.warning (ex.getMessage ()); } }
Ha egy kivétel be van csomagolva egy másikba, akkor visszaállíthatja a becsomagolt kivételt:
Dobható ok = ex.getCause (); log.warning ("Alapvető ok:" + põhjus.getMessage ());
Hozzá kell férnie a veremkövetéshez, és talán ki kell vonnia annak a módszernek a nevét, amely azt okozta?
StringBuilder sbuf = új StringBuilder ("Stack Trace:"); for (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). függelék ("\ n"); } log.warning (sbuf.toString ());
Vagy talán jelentkezzen be a kivételre, és újra dobja be?
próbálja meg {... } fogás (java.io. IOException ex) {log.warning (ex.getMessage ()); dobja ex; }
Az Kivétel osztály nyújt a printStackTrace () módszer, amellyel kinyomtathatja a köteg nyomkövetését PrintStream (vagy PrintWriter).
próbálja meg {... } fogás (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }
Egyszerre több kivételtípus is elérhető próbáld ki blokkolja, és minden kivételtípushoz hajtson végre speciális kezelést.
próbálkozás {// ide vet néhány kivételt. } fogás (java.io. IOException ex) {// IOException-specifikus kezelés itt. } fogás (java.sql. SQLException ex) {// SQLException-specifikus kezelés itt. }
Több kivételtípus elkapásához, de ugyanazon kezelési kód használatával kijelentheti a fogás tömb többféle módon, az alábbiak szerint:
próbálkozás {// ide vet néhány kivételt. } fogás (java.io. IOException | java.sql. SQLException ex) {// IOException és SQLException specifikus kezelés itt. } catch (SAXException ex) {// SAXException specifikus kezelés itt. }
Források megtisztítása végül
Amikor kivételt kiváltó kóddal foglalkozik, elengedhetetlen minden erőforrás megfelelő megtisztítása, például a megnyitott fájlokat Minden, amit tudnia kell a fájlformátumokról és azok tulajdonságairólA szófájlt felcserélhetően használjuk: zene, kép, táblázat, diavetítés és így tovább. De miért teszi a fájlt "fájlnak"? Próbáljuk megérteni a számítástechnika ezen alapvető részét. Olvass tovább , adatbázis-kapcsolatok stb. Az erőforrások megtisztítását a következők szerint kell végrehajtani: végül Blokk. Ilyen módon a normál kilépés és a blokkból történő kivételes kilépés meghívja a tisztítási kód A történelem 10 legrosszabb programozási hibájaAz emeletes múltjában a kódolás is megsemmisített. Egy kicsit rossz kód esetén nagy katasztrófát okozott. Az alábbiakban a történelem 10 legrosszabb programozási hibája látható. Olvass tovább .
InputStream in = null; próbálja meg {... in = new FileInputStream (fájlnév);... } fogás (java.io. IOException ex) {log.warning (ex.getMessage ()); } végül a {// kódot hajtjuk végre a kipróbálási blokkból való kilépéskor, // normál esetben vagy kivétel miatt, ha (in! = null) in.close (); }
Próbálja ki az erőforrások blokkolása
A Java 1.7 bemutatta a try-with-források az erőforrások megtisztítását megkönnyítő konstrukció. Ez így néz ki:
próbálja (InputStream in = new FileInputStream (..))) {// kód, amely az InputStream-t használja. }
Amikor a kód kilép a blokkból (tisztán vagy kivétel miatt), a InputStream A változó automatikusan megtisztul.
Tisztítson meg több erőforrást azáltal, hogy mindet deklarálja a blokk fejében.
try (InputStream in = új FileInputStream (..); Kapcsolat con =...; ) {// kód, amely az InputStream és a kapcsolat használatát használja. }
Bármely objektum, amelynek osztálya végrehajtja a AutoCloseable Az interfész így tisztítható. A következő osztály bizonyos tisztítást hajt végre a Bezárás() eljárás.
nyilvános osztályú MyClass végrehajtja az AutoCloseable {public void close () {// tisztító kód itt} }
Használjon ennek az osztálynak egy példányát a try-with-források Blokk.
kipróbálás (MyClass obj = new MyClass (..)) {// kód, amely a MyClass objektumot használja. }
Néhány gyakran felmerülő kivétel
Vessen egy pillantást néhány, a leggyakrabban előforduló kivételre.
- IndexOutOfBoundsException (nem jelölve): azt jelzi, hogy az elérni kívánt elem indexe egy tömb, karakterlánc stb. határain kívül esik.
- SQLException (bejelölve): adatbázis hiba miatt dobták el.
- IOException (be van jelölve): fájlhozzáférési hiba vagy hibák, amelyek a bemenethez és a kimenethez kapcsolódnak.
- InterruptedException (jelölve): dobás, amikor a szál végrehajtása megszakad.
- SAXException (bejelölve): XML elemzési hibák miatt dobták el.
- NullPointerException (nincs bejelölve): a null használata, ha objektumra van szükség.
Csomagolás fel
A Java jelentéseiben a kivételek jelentik az elsődleges módszer a hibajelentéshez és -kezeléshez. A kivételek megfelelő használata javítsa a kódminőséget Írjon vagy kódoljon gyorsabban a Linux szövegszerkesztőben, egyedi témákkalA Linux szövegszerkesztőnek nem kell egyértelműnek és "funkcionálisnak" lennie. Miért nem csípteti be a termelékenység fokozására, akár szkriptekkel és kódolásokkal, akár az eszközt jelölőszerkesztőként használva? Olvass tovább és segítséget nyújt a termelés során felmerülő kérdések megoldásában.
Van-e kivételével kapcsolatos háborús története? Ha igen, mondja el nekünk az alábbi megjegyzés szakaszban.
Kép jóváírása: Dmitrij Nikolaev a Shutterstock.com webhelyen keresztül