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.
instagram viewer

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.

Kivételi hierarchia

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