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ő:
ArithmeticException
mert megpróbálunk egy számot elosztani 0-val.ArrayIndexOutOfBoundsException
mert ú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 catch
blokkban 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 catch
blokkban.
Minden kivételt, amelyet a catch
blokk 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 catch
blokkban 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 catch
blokkot tartalmazó program, mivel nincs kódredundancia.
Megjegyzés: Ha egy catch
blokk 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 catch
blokkban több kivételt is elkap, a szabályt specializálásra általánosítják.
Ez azt jelenti, hogy ha a catch
blokkban 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 Exception
osztály alosztálya . Tehát ahelyett, hogy több speciális kivételt elkapnánk, egyszerűen elkapjuk az Exception
osztályt.
Ha az alap kivétel osztályt már megadták a catch
blokkban, ne használjon gyermek kivétel osztályokat ugyanabban a catch
blokkban. 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 ArrayIndexOutOfBoundsException
mindkettő az Exception
osztály alosztálya . Tehát fordítási hibát kapunk.