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:
ArithmeticException
koska yritämme jakaa luvun 0: lla.ArrayIndexOutOfBoundsException
koska olemme ilmoittaneet uuden kokonaislukumatriisin, jonka taulukkorajat ovat 0–9, ja yritämme määrittää arvon indeksille 10.
Tulostamme poikkeussanoman molemmissa catch
lohkoissa eli kaksoiskoodina.
Osoitusoperaattorin assosiatiivisuus =
on oikealta vasemmalle, joten ArithmeticException
heitetää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 catch
lohkoon.
Jokainen poikkeustyyppi, jota catch
lohko 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 catch
lohkoon 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 catch
lohkoja, koska koodin redundanssia ei ole.
Huomaa: Jos catch
lohko 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ä catch
lohkossa, sääntö yleistetään erikoistuneeksi.
Tämä tarkoittaa, että jos catch
lohkossa 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 Exception
luokan alaluokkia . Joten sen sijaan, että saisimme useita erikoistuneita poikkeuksia, voimme yksinkertaisesti kiinni Exception
luokan.
Jos peruspoikkeusluokka on jo määritetty catch
lohkossa, älä käytä alipoikkeusluokkia samassa catch
lohkossa. 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ä, ArithmeticException
ja ArrayIndexOutOfBoundsException
ovat molemmat Exception
luokan alaluokkia . Joten saamme kokoamisvirheen.