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:
ArithmeticExceptionsest proovime arvu jagada 0-ga.ArrayIndexOutOfBoundsExceptionkuna 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.








