A Java több kivételt is elkap

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

érdekes cikkek...