Java püüab mitu erandit

Selles õpetuses õpime näidete abil käsitsema Java-s mitut erandit.

Enne Java 7 pidime erinevat tüüpi erandite jaoks kirjutama mitu erandite käitlemise koodi, isegi kui kood oli üleliigne.

Võtame näite.

Näide 1: mitu püüdmisplokki

 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()); ) ) ) 

Väljund

 / nulliga 

Selles näites võib esineda kahte erandit:

  • ArithmeticException sest proovime arvu jagada 0-ga.
  • ArrayIndexOutOfBoundsException kuna oleme deklareerinud uue massiivi massiivi piiridega 0 kuni 9 ja proovime indeksile 10 väärtuse omistada.

Prindime mõlemas catchplokis välja eranditeate ehk duplikaadi.

Omistamisoperaatori assotsiatiivsus =on paremalt vasakule, seega ArithmeticExceptionvisatakse sõnumiga esimene / null.

Mitme erandi käsitlemine püüdeplokis

Java SE 7-s ja uuemates versioonides saame nüüd ühest catchplokist tabada rohkem kui ühte tüüpi erandeid .

Iga eranditüüp, mida catchplokk saab käsitleda, eraldatakse vertikaalse riba või toru abil |.

Selle süntaks on:

 try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block ) 

Näide 2: mitme saagi blokeerimine

 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()); ) ) ) 

Väljund

 / nulliga 

Mitme erandi tabamine ühes catchplokis vähendab koodi dubleerimist ja suurendab tõhusust.

Selle programmi kompileerimisel loodud baitkood on väiksem kui mitme catchplokiga programmil, kuna koodide üleliigsust pole.

Märkus. Kui catchplokk tegeleb mitme erandiga, on vaikimisi püüdmisparameeter final. See tähendab, et me ei saa parameetrite püüdmiseks määrata ühtegi väärtust.

Püüdmisbaasi erand

Mitme erandi tabamisel ühes catchplokis üldistatakse reegel spetsialiseeritud.

See tähendab, et kui catchplokis on erandite hierarhia , võime põhierandi tabada ainult mitme spetsialiseeritud erandi püüdmise asemel.

Võtame näite.

Näide 3: Ainult põhierandi klassi püüdmine

 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()); ) ) ) 

Väljund

 / nulliga 

Me teame, et kõik erandklassid on Exceptionklassi alamklassid . Niisiis, selle asemel, et tabada mitut spetsialiseeritud erandit, võime Exceptionklassi lihtsalt kätte saada .

Kui baaserandite klass on juba catchplokis täpsustatud , ärge kasutage samas catchplokis alamerandi klassi . Vastasel juhul saame kompileerimisvea.

Võtame näite.

Näide 4: baasi ja lapse erandite klasside püüdmine

 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()); ) ) ) 

Väljund

 Main.java:6: tõrge: Mitmepüügilause alternatiive ei saa alamklasside järgi seostada 

Selles näites ArithmeticExceptionja ArrayIndexOutOfBoundsExceptionmõlemad on Exceptionklassi alamklassid . Nii saame kompileerimisvea.

Huvitavad Artiklid...