Tässä opetusohjelmassa opimme käsittelemään useita Java-poikkeuksia esimerkkien avulla.
Ennen Java 7: ää jouduimme kirjoittamaan useita poikkeusten käsittelykoodeja erityyppisille poikkeuksille, vaikka koodin redundanssi olisi ollut olemassa.
Otetaan esimerkki.
Esimerkki 1: Useita salpalohkoja
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()); ) ) )
Tuotos
/ nollalla
Tässä esimerkissä voi esiintyä kaksi poikkeusta:
ArithmeticExceptionkoska yritämme jakaa luvun 0: lla.ArrayIndexOutOfBoundsExceptionkoska olemme ilmoittaneet uuden kokonaislukumatriisin, jonka taulukkorajat ovat 0–9, ja yritämme määrittää arvon indeksille 10.
Tulostamme poikkeussanoman molemmissa catchlohkoissa eli kaksoiskoodina.
Osoitusoperaattorin assosiatiivisuus =on oikealta vasemmalle, joten ArithmeticExceptionheitetään ensin viesti / nolla.
Käsittele useita poikkeuksia salpalohkossa
Java SE 7: ssä ja sitä uudemmissa versioissa voimme nyt saada useamman kuin yhden tyyppisen poikkeuksen yhteen catchlohkoon.
Jokainen poikkeustyyppi, jota catchlohko voi käsitellä, erotetaan pystysuoralla tangolla tai putkella |.
Sen syntaksi on:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Esimerkki 2: Monisäiliö
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()); ) ) )
Tuotos
/ nollalla
Useiden poikkeusten saaminen yhteen catchlohkoon vähentää koodin päällekkäisyyttä ja lisää tehokkuutta.
Tämän ohjelman kääntämisen yhteydessä luotu tavukoodi on pienempi kuin ohjelmassa, jossa on useita catchlohkoja, koska koodin redundanssia ei ole.
Huomaa: Jos catchlohko käsittelee useita poikkeuksia, salausparametri on implisiittinen final. Tämä tarkoittaa, että emme voi määrittää parametreja varten arvoja.
Saalispohjan poikkeus
Kun saamme useita poikkeuksia yhdessä catchlohkossa, sääntö yleistetään erikoistuneeksi.
Tämä tarkoittaa, että jos catchlohkossa on poikkeushierarkia , voimme saada kiinni vain peruspoikkeuksen useiden erikoistuneiden poikkeusten sijaan.
Otetaan esimerkki.
Esimerkki 3: Vain peruspoikkeusluokan kiinniotto
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()); ) ) )
Tuotos
/ nollalla
Tiedämme, että kaikki poikkeusluokat ovat Exceptionluokan alaluokkia . Joten sen sijaan, että saisimme useita erikoistuneita poikkeuksia, voimme yksinkertaisesti kiinni Exceptionluokan.
Jos peruspoikkeusluokka on jo määritetty catchlohkossa, älä käytä alipoikkeusluokkia samassa catchlohkossa. Muuten saamme kokoamisvirheen.
Otetaan esimerkki.
Esimerkki 4: Perus- ja lapsipoikkeusluokkien saaminen
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()); ) ) )
Tuotos
Main.java:6: error: Usean saaliin lauseen vaihtoehtoja ei voida yhdistää alaluokkiin
Tässä esimerkissä, ArithmeticExceptionja ArrayIndexOutOfBoundsExceptionovat molemmat Exceptionluokan alaluokkia . Joten saamme kokoamisvirheen.








