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 catch
plokis välja eranditeate ehk duplikaadi.
Omistamisoperaatori assotsiatiivsus =
on paremalt vasakule, seega ArithmeticException
visatakse sõnumiga esimene / null.
Mitme erandi käsitlemine püüdeplokis
Java SE 7-s ja uuemates versioonides saame nüüd ühest catch
plokist tabada rohkem kui ühte tüüpi erandeid .
Iga eranditüüp, mida catch
plokk 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 catch
plokis vähendab koodi dubleerimist ja suurendab tõhusust.
Selle programmi kompileerimisel loodud baitkood on väiksem kui mitme catch
plokiga programmil, kuna koodide üleliigsust pole.
Märkus. Kui catch
plokk 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 catch
plokis üldistatakse reegel spetsialiseeritud.
See tähendab, et kui catch
plokis 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 Exception
klassi alamklassid . Niisiis, selle asemel, et tabada mitut spetsialiseeritud erandit, võime Exception
klassi lihtsalt kätte saada .
Kui baaserandite klass on juba catch
plokis täpsustatud , ärge kasutage samas catch
plokis 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 ArithmeticException
ja ArrayIndexOutOfBoundsException
mõlemad on Exception
klassi alamklassid . Nii saame kompileerimisvea.