Java saa useita poikkeuksia

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 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.

Mielenkiintoisia artikkeleita...