Ebben az oktatóanyagban megtanulunk több kivételt kezelni a Java-ban példák segítségével.
A Java 7 előtt több kivételkezelő kódot kellett írnunk a különböző típusú kivételekhez, még akkor is, ha kód redundancia volt.
Vegyünk egy példát.
1. példa: Több elkapási blokk
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException e) ( System.out.println(e.getMessage()); ) catch (ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Kimenet
/ nullával
Ebben a példában két kivétel fordulhat elő:
ArithmeticExceptionmert megpróbálunk egy számot elosztani 0-val.ArrayIndexOutOfBoundsExceptionmert új egész tömböt deklaráltunk 0 és 9 közötti tömbhatárokkal, és megpróbálunk értéket rendelni a 10 indexhez.
Mindkét catchblokkban kinyomtatjuk a kivétel üzenetet, azaz duplikált kódot.
A hozzárendelés operátor asszociativitása =jobbról balra, tehát egy ArithmeticExceptionüzenetet dobunk elõször az üzenettel / nulla.
Több kivétel kezelése egy elkapási blokkban
A Java SE 7-es és újabb verzióiban mostantól több kivételt is elkaphatunk egyetlen catchblokkban.
Minden kivételt, amelyet a catchblokk kezelhet, függőleges sáv vagy cső választja el |.
Szintaxisa:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
2. példa: Többfogásos blokk
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Kimenet
/ nullával
Több kivétel elkapása egyetlen catchblokkban csökkenti a kód duplikálását és növeli a hatékonyságot.
A program fordítása közben létrehozott bájtkód kisebb lesz, mint a több catchblokkot tartalmazó program, mivel nincs kódredundancia.
Megjegyzés: Ha egy catchblokk több kivételt kezel, akkor a catch paraméter implicit módon történik final. Ez azt jelenti, hogy nem rendelhetünk értékeket a paraméterek fogásához.
Fogási alap kivétel
Ha egy catchblokkban több kivételt is elkap, a szabályt specializálásra általánosítják.
Ez azt jelenti, hogy ha a catchblokkban kivételes hierarchia van , akkor több speciális kivétel elkapása helyett csak az alapkivételt tudjuk megfogni.
Vegyünk egy példát.
3. példa: Csak az alap kivétel osztály befogása
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception e) ( System.out.println(e.getMessage()); ) ) )
Kimenet
/ nullával
Tudjuk, hogy az összes kivétel osztály az Exceptionosztály alosztálya . Tehát ahelyett, hogy több speciális kivételt elkapnánk, egyszerűen elkapjuk az Exceptionosztályt.
Ha az alap kivétel osztályt már megadták a catchblokkban, ne használjon gyermek kivétel osztályokat ugyanabban a catchblokkban. Ellenkező esetben fordítási hibát kapunk.
Vegyünk egy példát.
4. példa: Alap és gyermek kivétel osztályok befogása
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Kimenet
Main.java:6: hiba: A többfogásos utasítás alternatívái nem kapcsolhatók alosztályozással
Ebben a példában, ArithmeticExceptionés ArrayIndexOutOfBoundsExceptionmindkettő az Exceptionosztály alosztálya . Tehát fordítási hibát kapunk.








