1 / 12

Poikkeustenkäsittely

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

Download Presentation

Poikkeustenkäsittely

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 laitetaantry-catchlohkon 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(); doublemaara; Scannerinput = 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. Poikkeusluokkia Ohjelmointivirheet ja ohjelman suoritusaikaiset virheet (esim. viitataan taulukon rajojen ulkopuolelle). Vakavat peruttamattomat virheet, joihin ohjelmoija ei aina voi vaikuttaa (esim. muistin loppuminen ohjelman suorituksen aikana). Trowable Exception Error Aliluokkia, jotka kertovat poikkeuksen syyn tarkemmin IOException RuntimeException 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). 6 jatkuu…

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

  8. Try-esimerkki (monta catch:a) • Tee ohjelma, joka tekee tilille panon Kutsutaan metodia oliolle, jota ei ole public static void main(String[] args) { Tili tili = null; doublemaara; 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) */ } 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). privatestaticintpyydaKokonaisluku() throwsNumberFormatException{ Stringsyote; intluku; System.out.println("Anna kokonaisluku: "); try{ syote= input.nextLine(); luku = Integer.parseInt(syote); // voi heittää poikk. } catch (NumberFormatException e) { throwe; // throw lopettaa myös metodin suorituksen } returnluku; } 10

  11. …Throw-esimerkki jatkuu publicstaticScanner input = newScanner(System.in); publicstaticvoidmain(String[] args) { intika; booleanokSyote = 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. try { // koodia, missä poikkeus voi tapahtua } catch (Exception e) { e.printStackTrace(); } finally { // suoritetaan aina } 12

More Related