Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1.

Samankaltaiset esitykset


Esitys aiheesta: "Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1."— Esityksen transkriptio:

1 Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1

2 Mitä poikkeustenkäsittely tarkoittaa?  Poikkeus (Exception) on tarkoittaa sitä, että ohjelmassa tapahtuu jotain epänormaalia esim. ohjelma kaatuu kesken suorituksen. Ohjelman kaatuminen voi johtua mm. siitä, että käyttäjä syöttää numeron sijaan kirjaimia.  Jotta ohjelma toimisi poikkeuksesta huolimatta, ohjelmaan voidaan koodata poikkeustenkäsittely.  Osa poikkeuksista on sellaisia, jotka on pakko käsitellä (esim. varautuminen tiedostoja käsiteltäessä tiedoston puuttumiseen) tai vapaaehtoisia (esim. varautuminen virheelliseen syötteeseen). 2

3 Poikkeusten käsitteleminen  Poikkeukseen varaudutaan siten, että poikkeuksen mahdollisesti aiheuttava koodi laitetaan try-catch lohkon sisään.  Jos koodissa tapahtuu poikkeus, try-lohkon suoritus loppuu kesken ja siirrytään catch-lohkoon.  Jos koodissa ei tapahdu poikkeusta, try-lohko suoritetaan loppuun ja catch-lohkoa ei suoriteta ollenkaan.  Lisäksi voidaan laittaa finally-lohko, mikä suoritetaan aina lopuksi. try { // koodia, missä poikkeus voi tapahtua } catch (Exception e) { // mitä tehdään kun poikkeus tapahtuu } finally { // suoritetaan aina } 3

4 Try-Catch-esimerkki public static void main(String[] args) { Tili tili = new Tili(); double maara; Scanner input = new Scanner(System.in); System.out.print("Anna tilille panon määrä: "); try { maara = input.nextDouble(); tili.pano(maara); System.out.println("Pano onnistui"); } catch (Exception e) { System.out.println("Pano epäonnistui, määrä ei ole luku"); } Tee ohjelma, jolla tilille tehdään pano. jos käyttäjä antaa muuta kuin luvun, koodin suoritus siirtyy catch-lohkoon 4

5 Poikkeusluokkien hierarkia  Seuraavalla sivuilla on esittely poikkeusluokkien periytymishierarkia.  Hierarkiassa ylimpänä on Trowable-yliluokka, josta periytyy Error- ja Exception-nimiset aliluokat.  Luokkakaaviossa periytymisyhteys kuvataan luokkien välisellä yhteysviivalla, jonka yliluokan päässä on kolmiosymboli. 5

6 Vakavat peruttamattomat virheet, joihin ohjelmoija ei aina voi vaikuttaa (esim. muistin loppuminen ohjelman suorituksen aikana). Tilanteet, joita ohjelmoija ei välttämättä tiedä etukäteen, mutta ne on huomioitava ohjelmakoodissa. (esim. yritys lukea tiedoston lopun yli, yritys hakea verkosta olematonta resurssia). Ohjelmointivirheet ja ohjelman suoritusaikaiset virheet (esim. viitataan taulukon rajojen ulkopuolelle). Trowable Error Exception IOException RuntimeException Poikkeusluokkia jatkuu… Aliluokkia, jotka kertovat poikkeuksen syyn tarkemmin 6

7 RuntimeException IndexOutOfBoundsException IllegalArgumentException NullPointerException NumberFormatException ArrayIndexOutOfBounds -Exception ArithmeticException Yritetään käyttää oliota, mitä ei ole Merkkijonoa ei voida muuntaa luvuksi 7 … jatkuu ed. sivulta

8 Try-esimerkki (monta catch:a) public static void main(String[] args) { Tili tili = null; double maara; Scanner input = new Scanner(System.in); System.out.print("Anna tilille panon määrä: "); try { maara = input.nextDouble(); tili.pano(maara); System.out.println("Pano onnistui"); } catch (NullPointerException e) { System.out.println("Tiliä ei ole"); } catch (Exception e) { System.out.println("Pano epäonnistui, määrä ei ole luku"); } /* Kun catch-osia on monta, laitetaan periytymishierarkiassa alempi poikkeustyyppi ennen ylempää tyyppiä(tässä NullPointerException ennen Exception:a) */ } Tee ohjelma, joka tekee tilille panon Kutsutaan metodia oliolle, jota ei ole 8

9 Poikkeuksen heittäminen  Try-catch-lohkossa voidaan poikkeus myös heittää (throw) metodien kutsuketjussa ylöspäin. Tällöin toinen metodi käsittelee poikkeuksen.  Poikkeuksen heittävä metodi esitellään tyyliin: näkyvyys tyyppi metodinNimi(parametrit..) throws poikkeustyyppi1,…, poikkeustyyppi_n  Poikkeuksen heittävää metodia on aina kutsuttava try-lohkossa, jotta ollaan valmiita ottamaan kiinni mahdollinen poikkeus. 9

10 Throw-esimerkki  Esimerkissä metodi pyydaKokonaisluku() heittää tarvittaessa ajoaikaisen poikkeuksen.  Ohjelman main()-metodissa pitää tätä metodia kutsua aina try- catch-lohkossa (kts. seur. sivu). private static int pyydaKokonaisluku() throws NumberFormatEx ception { String syote; int luku; System.out.println("Anna kokonaisluku: "); try { syote = input.nextLine(); luku = Integer.parseInt(syote); // voi heittää poikk. } catch (NumberFormatException e) { throw e; // throw lopettaa myös metodin suorituksen } return luku; } 10

11 …Throw-esimerkki jatkuu public static Scanner input = new Scanner(System.in); public static void main(String[] args) { int ika; boolean okSyote = false; do { try { ika = pyydaKokonaisluku();//metodi voi heit. poikk. okSyote = true; } catch (NumberFormatException e) { System.out.println("Syötä kokonaisluku numeroina!"); } } while (okSyote != true); //... ohjelma jatkuu System.out.println("Kiitos ohjelman käytöstä"); } 11

12 printStackTrace()  Exception-luokalla on mm. metodi printStackTrace(). Metodi tulostaa tiedon siitä, minkä metodien kutsuketjun seurauksena poikkeus tapahtui. 12 try { // koodia, missä poikkeus voi tapahtua } catch (Exception e) { e.printStackTrace(); } finally { // suoritetaan aina }


Lataa ppt "Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1."

Samankaltaiset esitykset


Iklan oleh Google