Általános Java-kivételek

1. Bemutatkozás

Ez az oktatóanyag néhány általános Java-kivételre összpontosít.

Kezdjük azzal, hogy megvitatjuk, mi a kivétel alapvetően. Később részletesen megvitatjuk a különböző típusú ellenőrzött és ellenőrizetlen kivételeket.

2. Kivételek

Kivételt képez egy olyan rendellenes állapot, amely a program végrehajtása során egy kódsorban fordul elő. Ez a rendellenes állapot akkor merül fel, amikor egy program futás közben megszeg bizonyos korlátozásokat.

Minden kivételtípus az osztály alosztálya Kivétel. Ezt az osztályt ezután beosztják ellenőrzött kivételekbe és nem ellenőrzött kivételekbe. Részletesen megvizsgáljuk őket a következő szakaszokban.

3. Ellenőrzött kivételek

Az ellenőrzött kivételeket kötelező kezelni. Az osztály közvetlen alosztályai Kivétel.

Fontosságukról vita folyik, amelyet érdemes megnézni.

Definiáljunk részletesen néhány ellenőrzött kivételt.

3.1. IOException

Egy módszer dob egy IOException vagy annak közvetlen alosztálya, ha bármelyik Input / Output művelet meghiúsul.

Ezen I / O műveletek tipikus felhasználási területei:

  • Munka a fájlrendszerrel vagy az adatfolyamokkal a java.io csomag
  • Hálózati alkalmazások létrehozása a java.net csomag

FileNotFoundException

FileNotFoundException általános típusa IOException a fájlrendszerrel való munka közben:

próbáld ki az {új FileReader (új File ("/ érvénytelen / file / hely")) parancsot; } catch (FileNotFoundException e) {LOGGER.info ("FileNotFoundException elkapva!"); }

Rosszul formáltURLEkivétel

Az URL-ekkel való munka során találkozhatunk a következőkkel: Rosszul formáltURLEkivétel - ha URL-címeink érvénytelenek.

próbáld ki az {új URL-t ("malformedurl"); } catch (rosszul formáltURLException e) {LOGGER.error ("hibásan formáltURLException elkapva!"); }

3.2. ParseException

A Java egy szöveg alapján elemez egy objektumot egy adott alapján Húr.Ha az elemzés hibát okoz, akkor a ParseException.

Például képviselhetnénk Dátum különböző módon pl. éééé / hh / nn vagy éééé, hh, nn de próbálja elemezni a húr más formátumban:

próbáld ki az {új SimpleDateFormat ("MM, dd, yyyy"). parse ("érvénytelen-dátum"); } catch (ParseException e) {LOGGER.error ("ParseException elfogva!"); }

Itt a Húr rosszul formált és a ParseException.

3.3. InterruptedException

Amikor egy Java szál hív csatlakozás (), alvás () vagy várjon() vagy a VÁRAKOZÁS állam vagy a TIMED_WAITING állapot.

Ezenkívül egy szál megszakíthat egy másik szálat egy másik szál meghívásával megszakítás () módszer.

Következésképpen, a cérna dob egy InterruptedException ha egy másik szál megszakítja, amíg a VÁRAKOZÁS vagy a TIMED_WAITING állapot.

Tekintsük a következő példát két szálon:

  • A fő szál elindítja és megszakítja a gyermek szálat
  • A gyermek szál elindul és hív alvás()

Ez a forgatókönyv egy InterruptedException:

class ChildThread kiterjeszti a Threadot {public void run () {try {Thread.sleep (1000); } catch (InterruptedException e) {LOGGER.error ("InterruptedException elfogott!"); }}} public class MainThread {public static void main (String [] args) dob InterruptedException {ChildThread childThread = new ChildThread (); childThread.start (); childThread.interrupt (); }}

4. Ellenőrizetlen kivételek

Ellenőrizetlen kivételek esetén a fordító nem ellenőrzi a fordítási folyamat során. Ezért nem kötelező, hogy a módszer kezelje ezeket a kivételeket.

Minden ellenőrizetlen kivétel kiterjeszti az osztályt RuntimeException.

Beszéljünk részletesen néhány ellenőrizetlen kivételt.

4.1. NullPointerException

Ha egy alkalmazás megpróbálja használni nulla ahol valójában objektum példányt igényel, a metódus a-t dob NullPointerException.

Különböző forgatókönyvek léteznek a nulla okoz NullPointerException. Tekintsünk néhányat közülük.

Az osztály metódusának meghívása, amelynek nincs objektumpéldánya:

String strObj = null; strObj.equals ("Hello World"); // dobja a NullPointerException-t.

Továbbá, ha egy alkalmazás megpróbálja elérni vagy módosítani a példányváltozót a-val nulla referenciát kapunk NullPointerException:

Személy personObj = null; Karakterlánc neve = personObj.personName; // A nullobjektum mezőjének elérése personObj.personName = "Jon Doe"; // Egy null objektum mezőjének módosítása

4.2. ArrayIndexOutOfBoundsException

Egy tömb egybefüggő módon tárolja elemeit. Így elemeihez indexekkel juthatunk hozzá.

azonban, ha egy kóddarab megpróbál hozzáférni egy tömb illegális indexéhez, akkor a megfelelő módszer egy ArrayIndexOutOfBoundException.

Nézzünk meg néhány dobó példát ArrayIndexOutOfBoundException:

int [] nums = új int [] {1, 2, 3}; int numFromNegativeIndex = nums [-1]; // Megpróbál elérni negatív indexen int numFromGreaterIndex = nums [4]; // Nagyobb indexnél próbálunk elérni int numFromLengthIndex = nums [3]; // Megpróbál elérni a tömb méretével megegyező indexen

4.3. StringIndexOutOfBoundsException

A Húr osztály a Java-ban biztosítja a metódusokat a karakterlánc egy adott karakterének elérésére vagy egy karakter tömb kivágására a Húr. Amikor ezeket a módszereket alkalmazzuk, belülről konvertálja a Húr karaktertömbbe.

Ismét előfordulhat, hogy az indexek illegális felhasználása van ezen a tömbön. Ilyen esetekben ezek a módszerek Húr osztály dobja a StringIndexOutOfBoundsException.

Ez a kivétel azt jelzi, hogy az index nagyobb vagy egyenlő az index méretével Húr.StringIndexOutOfBoundsException kiterjed IndexOutOfBoundsException.

A módszer, a metódus charAt (index) osztályának Húr dobja ezt a kivételt, amikor megpróbálunk elérni egy karaktert a Húrok hossza vagy más illegális index:

String str = "Hello World"; char charAtNegativeIndex = str.charAt (-1); // Megpróbál hozzáférni a negatív indexen char charAtLengthIndex = str.charAt (11); // Megpróbál elérni a karakterlánc méretével megegyező indexen 

4.4. NumberFormatException

Gyakran egy alkalmazás végül numerikus adatokkal rendelkezik a Húr. Annak érdekében, hogy ezeket az adatokat numerikusként értelmezze, a Java lehetővé teszi a konvertálást Húr numerikus típusokhoz. A burkoló osztályok, mint pl Egész, úszó stb. e célra szolgáló hasznossági módszereket tartalmaz.

Azonban, ha a Húr az átalakítás során nincs megfelelő formátuma, a metódus a NumberFormatException.

Vegyük fontolóra a következő részletet.

Itt kijelentjük a Húr alfanumerikus adatokkal. Továbbá megpróbáljuk használni a Egész szám burkoló osztály az adatok numerikus értelmezéséhez.

Következésképpen ez azt eredményezi NumberFormatException:

String str = "100ABCD"; int x = Egész.parseInt (str); // Throws NumberFormatException int y = Integer.valueOf (str); // Throws NumberFormatException

4.5. Számtani kivétel

Amikor egy program kiértékeli egy számtani műveletet, és ez valamilyen kivételes állapotot eredményez, akkor dob Számtani kivétel. Továbbá, Számtani kivétel csak azokra vonatkozik int és hosszú adattípusok.

Például, ha megpróbálunk egy egészet nullával osztani, akkor egy Számtani kivétel:

int illegálisMűvelet = 30/0; // ArithmeticException dob

4.6. ClassCastException

A Java lehetővé teszi az objektumok közötti tipizálást az öröklés és a polimorfizmus támogatása érdekében. Vagy felboríthatunk egy tárgyat, vagy lecsökkenthetjük.

Az upcastingban egy objektumot annak szupertípusára vetünk. A lecsökkentés során pedig egy tárgyat az egyik altípusára vetünk.

Azonban, futás közben, ha a kód megpróbál egy objektumot egy olyan altípussá lebontani, amelynek nem példánya, a metódus ClassCastException.

A futásidejű példány az, ami valójában számít a tipizálásban. Tekintsük a következő öröklést között Állat, Kutya és Oroszlán:

állat állat {} osztály kutya kiterjeszti állat {} osztály oroszlán kiterjeszti állat {} 

Továbbá a sofőrosztályban mi dobtuk a Állat hivatkozást tartalmazó hivatkozás Oroszlán ba be Kutya.

Futás közben azonban a JVM észreveszi azt a példányt Oroszlán nem kompatibilis az osztály altípusával Kutya.

Ennek eredményeként ClassCastException:

Állati állat = új Oroszlán (); // Futás közben a példány Lion Dog tommy = (Kutya) állat; // Dobja a ClassCastException

4.7. IllegalArgumentException

Egy módszer dob egy IllegalArgumentException ha illegális vagy nem megfelelő érvekkel hívjuk.

Például a alvás() módszere cérna osztály pozitív időt vár el, és negatív időintervallumot adunk át érvként. Ennek eredményeként IllegalArgumentException:

Thread.currentThread (). Sleep (-10000); // IllegalArgumentException dob

4.8. IllegalStateException

IllegalStateException jelzi, hogy egy módszerre illegális vagy nem megfelelő időpontban hivatkoztak.

Minden Java objektumnak van állapota (példányváltozói) és bizonyos viselkedése (metódusai). Így, IllegalStateException azt jelenti, hogy törvényellenes hivatkozni az objektum viselkedésére a jelenlegi állapotváltozókkal.

Néhány különböző állapotváltozóval azonban törvényes lehet.

Például egy iterátort használunk a lista iterálásához. Valahányszor inicializálunk egyet, belsőleg beállítja állapotváltozóját lastRet -1-ig.

Ezzel a kontextussal a program megpróbálja meghívni a eltávolítani módszer a listán:

// Inicializálva -1-es indexel Iterator intListIterator = new ArrayList (). Iterator (); intListIterator.remove (); // IllegalStateException 

Belsőleg az eltávolítani metódus ellenőrzi az állapotváltozót lastRet és ha kisebb, mint 0, akkor dob IllegalStateException. Itt a változó továbbra is a -1 értékre mutat.

Ennek eredményeként kapunk egy IllegalStateException.

5. Következtetés

Ebben a cikkben először megvitattuk, melyek a kivételek. An kivétel egy program végrehajtása során bekövetkező esemény, amely megzavarja a program utasításainak normál folyamatát.

Ezután a kivételeket az Ellenőrzött Kivételek és az Ellenőrzetlen Kivételek kategóriába soroltuk.

Ezután különböző típusú kivételeket vitattunk meg, amelyek felmerülhetnek a fordítás során vagy a futás során.

A cikk kódját a GitHubon találjuk meg.