14. Poikkeukset 14.1. 14.2 Sisällys Johdanto poikkeuksiin. Poikkeusten käsittely: − Poikkeusten käsittely paikallisesti. − Poikkeusten heittäminen. Exception.

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

6. Metodit.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
16. Javan omat luokat.
Jukka Juslin Poikkeukset ja niiden paikallistaminen * Jukka Juslin * Liittyy oppikirjan lukuun 11.
Taulukot: Array Taulukko Javassa pitää aina perustaa (new)
Taulukoiden määrittely, käsittely ja kopiointi Vaihtoehdot taulukoille
22. Taulukot.
Käännösaikaiset virheilmoitukset • Tulee silloin, kun koodissa on jotain sellaista, joka ei ole Javan syntaksin mukaista • Esim. – Syntax error, insert.
13. Pakkaukset.
Näytölle tulostaminen. 7.2 Sisällys System.out.println - ja System.out.print -operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden.
Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 4 Toistolauseet
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Yksinkertaiset graafiset syöttö- ja tulostustoiminnot.
Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja.
16. Lohkot Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat.
© Jukka Harju, Jukka Juslin Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 9 Poikkeuskäsittely.
Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1.
9. Periytyminen Javassa.
Toiston tekeminen Javalla  Mikä toistorakenne on?  while toistorakenne  do-while toistorakenne  for toistorakenne 1.
© Jukka Harju, Jukka Juslin
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
7. Oliot ja viitteet.
Map-luokka Mikä Map on? Mapin esittely ja luonti Map-luokan metodeja Mappiin lisääminen Mapin läpikäynti Mapista poistaminen 1.
String-vertailusta ja Scannerin käytöstä (1/2)
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
20. Javan omat luokat.
Kuinka niitä käsitellään
1 DataOutputStream ja DataInputStream DataOutputStream:lla voidaan tallentaa perustietotyyppien arvoja binäärimuotoiseen tiedostoon DataInputStream:lla.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Näppäimistöltä lukeminen Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In -luokka.
Hyvä ohjelmointitapa (osa 2) Yleistä Lisää hyviä ohjelmointikäytäntöjä: − Jaa pitkä koodi osiin. − Käytä attribuutteja säästeliäästi.
22. Taulukot.
Poikkeukset Yleistä Virheeseen varautuminen tarkoittaa sitä, että ohjelmoija huomioi koodia kirjoittaessaan ajonaikaisen virheen mahdollisuuden.
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely.
Poikkeustenkäsittely- lohkot tMyn1 Poikkeustenkäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw.
Tiedostojen käsittely
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
11. Rajapinnat Sisällys Mitä rajapinnat ovat? Kuinka ne määritellään ja otetaan käyttöön? Moniperiytyminen rajapintojen avulla. Varoituksen.
Javan oliovirrat eli oliotiedostojen käsittely. Olio- eli objektitiedostojen käsittely Käsittely täysin samanlaista kuin muiden tiedostojen 1.Otetaan.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
15. Ohjelmoinnin tekniikkaa
Tiedostot. 8.2 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen.
15. Ohjelmoinnin tekniikkaa Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi.
String-vertailusta ja Scannerin käytöstä (1/2)
6. Tiedostot.
1. Omat operaatiot.
Poikkeustenkäsittelylohkot try-catch
2. Taulukot.
14. Poikkeukset.
Kuinka niitä käsitellään
8. Näppäimistöltä lukeminen
7. Hyvä ohjelmointitapa..
15. Ohjelmoinnin tekniikkaa
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
8. Näppäimistöltä lukeminen
Kuinka niitä käsitellään
2. Taulukot.
7. Oliot ja viitteet.
13. Pakkaukset.
14. Poikkeukset.
7. Näytölle tulostaminen
3. Attribuutit.
14. Poikkeukset.
13. Pakkaukset.
4. Luokan testaus ja käyttö olion kautta
eli oliotiedostojen käsittely
Esityksen transkriptio:

14. Poikkeukset 14.1

14.2 Sisällys Johdanto poikkeuksiin. Poikkeusten käsittely: − Poikkeusten käsittely paikallisesti. − Poikkeusten heittäminen. Exception -luokka.

14.3 Johdanto Ohjelman ajon aikana ilmennyt virhe pysäyttää ohjelman ellei virheeseen ole varattu asianmukaisesti. − Ohjelman “kaatuminen” ei ole toivottavaa, koska siitä on aina harmia käyttäjälle. − Jos virheestä ei voi toipua, tulisi ohjelman kaatumisen kuitenkin tapahtua hallitusti. Perinteiset tavat käsitellä ajonaikaisia virheitä: − Tunnistetaan ja vältetään, mutta ei reagoida muuten. − Tunnistetaan ja vältetään ja virheestä ilmoitetaan metodin paluuarvon avulla, jolloin metodia kutsuva metodi voi tarvittaessa reagoida virheeseen.

14.4 Johdanto Javassa ajonaikaisia virheitä voidaan käsitellä myös poikkeusten (exceptions) avulla. Ajonaikaista virhettä ei vältetä – virheen annetaan tapahtua, jolloin Java tuottaa virhettä vastaavan poikkeuksen. Ohjelma ei pysähdy, kun poikkeus tunnistetaan, siepataan ja käsitellään try - catch -lauseella. Poikkeukset ovat Javan luokkia, joista osa on jo tuttuja: − NullPointerException : viitteen oliolle ei ole varattu muistia. − ArrayIndexOutOfBoundsException : viitataan virheelliseen paikkaan taulukossa. − InputMismatchException : väärän tyyppinen syöte.

14.5 Exception -luokka RuntimeException -luokan ja sen jälkeläisluokkien mallintamia poikkeuksia (unchecked) ei ole pakko käsitellä. − Käytännössä nämä on käsiteltävä, jotta ohjelma ei kaatuisi. Kääntäjä pakottaa ohjelmoijan käsittelemään Exception -luokan muiden jälkeläisten poikkeukset (checked). Error -luokan periytymishaara mallintaa vakavat, virtuaalikoneen toimintaan liittyvät virheet, joita ei ole yleensä syytä käsitellä ohjelmallisesti. Pienen pieni osa Exception - luokan sisältävästä luokka- hierarkiasta: Throwable IOException Object ExceptionError RuntimeException NullPointerException

14.6 Poikkeusten käsittely Metodissa siepattu poikkeus voidaan: A) joko käsitellä paikallisesti tai B) heittää kutsuvan metodin käsiteltäväksi. Sieppaamaton unchecked-tyyppinen poikkeus siirtyy automaattisesti kutsuvalle metodille. − Checked-tyyppiset poikkeukset on pakko siepata ja heitettäessä ne on määriteltävä erikseen metodin otsikossa. Poikkeusta ei voida jättää koskaan huomiotta. − Ohjelman suoritus pysähtyy, mikäli poikkeusta ei käsitellä viimeistään pääohjelmassa.

14.7 Poikkeusten käsittely paikallisesti Tunnistaminen, sieppaus ja käsittely try - catch -lauseella. Poikkeuksen mahdollisesti tuottavat lauseet suljetaan try -lohkoon mielellään niin, ettei koodin luettavuus kärsi. Poikkeuksen tapahtuessa catch -lohkot tarkastellaan järjestyksessä ylhäältä alas. Poikkeus siepataan ensimmäiseen poikkeuksen tyyppiä vastaavaan catch - lohkoon. try { // Poikkeuksen mahdollisesti // tuottavat lauseet. } catch (Tyyppi1 e) { // Tyypin1 poikkeusten käsittely. } … catch (Tyyppi N e) { // Tyypin N poikkeusten käsittely. }

14.8 Poikkeusten käsittely paikallisesti Exception -tyyppisellä parametrilla varustettu catch -lohko sieppaa minkä tahansa poikkeuksen. − Käytettävä varovasti, koska voi estää virheiden havaitsemisen ja mahdollistaa huolimattoman poikkeusten käsittelyn. Ohjelman suoritus jatkuu try - catch -lausetta seuraavasta lauseesta. try { // Poikkeuksen mahdollisesti // tuottavat lauseet. } catch (Tyyppi1 e) { // Tyypin1 poikkeusten käsittely. } … catch (Exception e) { // Siepataan viimeistään tässä. }

14.9 Poikkeusten käsittely paikallisesti Javan versiosta 1.7 alkaen yhteen catch - osaan voi määritellä siepattavaksi useampia virheitä putkimerkin avulla. finally -lohko on valinnainen ja sen lauseet suoritetaan aina poikkeuksen tapahtumisesta riippumatta. try { // Poikkeuksen mahdollisesti // tuottavat lauseet. } catch (Tyyppi1 | Tyyppi2 e) { // Tyypin1 ja Tyypin2 poikkeusten käsittely. } … catch (Exception e) { // Siepataan viimeistään tässä. } finally { // Tämä lohko suoritetaan aina. }

14.10 Scanner & InputMismatchException import java.util.*; // Scanner-luokka täällä. public class InputMismatchExceptionTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // Liitetään oletussyötevirtaan. int luku; boolean syoteOK; do { // Luetaan, kunnes saadaan kokonaisluku. try {// Tämän lohkon aiheuttamat poikkeukset siepataan. syoteOK = true; System.out.print("Anna luku: "); luku = sc.nextInt(); // Väärän tyyppinen syöte => poikkeus. } catch (InputMismatchException e) { // Siepataan poikkeus. System.out.println("Virheellinen syöte!"); sc.nextLine(); // Poistetaan virheellinen syöte. syoteOK = false; } while (!syoteOK); }

14.11 Taulukon ja poikkeusten käsittelyä /* Lasketaan taulukon t paikoissa [a, b] olevien alkioiden summa. */ public static double laskeValinsumma( double [] t, int a, int b) { double summa = 0; try { // Tässä lohkossa voi tapahtua poikkeuksia. for ( int i = 0; i < b - a + 1; i++) summa += t[a + i]; } // Indeksiarvot a ja/tai b olivat virheellisiä. catch (ArrayIndexOutOfBoundsException e) { summa = Double.NaN; } // Taulukolle ei oltu varattu muistia (t == null). catch (NullPointerException e) { summa = Double.NaN; } return summa; }

14.12 Poikkeusten heittäminen Poikkeus voidaan heittää kutsuvalle metodille varattua sanaa throw käyttäen. Yleisesti: throw poikkeus; Esimerkiksi: throw new Exception("Tapahtui poikeus!"); Näin voidaan heittää myös siepattu poikkeus. Esimerkiksi: catch (ArrayIndexOutOfBoundsException e) { throw e; }

14.13 Poikkeusten heittäminen Metodin otsikossa on määriteltävä varatun sanan throws -avulla metodin heittämät checked-tyyppiset poikkeukset. − Unchecked-tyyppisiä poikkeuksia ei ole pakko määritellä, mutta kommenteissa on hyvä mainita metodin heittämät poikkeukset. Yleisesti: määreet metodinNimi ( parametrilista ) throws Poikkeus1,..., Poikkeus N {... Kutsuvassa metodissa on aina syytä varautua poikkeuksiin try - catch -lauseella, kun kutsuttavan metodin otsikossa esiintyy throws -määre. − Java “pakottaa” kutsuvan metodin tähän, jos metodi heittää checked-tyyppisen poikkeuksen.

14.14 Taulukon ja poikkeusten käsittelyä /* Lasketaan taulukon t paikoissa [a, b] olevien alkioiden summa. * Taulukon käsittelyyn liittyvistä virheistä kerrotaan IllegalArgumentException- * tyyppisellä poikkeuksella, jonka maininta otsikosta on valinnaista (unchecked). */ public static double laskeValinsumma( double [] t, int a, int b) throws IllegalArgumentException { try { double summa = 0; for ( int i = 0; i < b - a + 1; i++) summa += t[a + i]; return summa; } catch (Exception e) { throw new IllegalArgumentException(e); }

14.15 Taulukon ja poikkeusten käsittelyä public static void main(String[] args) { double summa; try { // Siepataan laskeValinsumma-metodin mahdolliset poikkeukset. double [] t1 = new double [] { 1.1, 2.2, 3.3, 4.4, 5.5 }; // Virheellinen indeksi tuottaa ArrayIndexOutOfBoundsException-poikkeuksen. summa = laskeValinsumma(t1, 0, 5); } // Taulukolle ei oltu varattu muistia (t == null) tai indeksiarvo(t) oli(vat) virheellisiä. catch (IllegalArgumentException e) { // java.lang.IllegalArgumentException: java.lang.ArrayIndexOutOfBoundsException: 5 System.out.println(e); }

14.16 Poikkeusten heittäminen rakentajasta Rakentaja ei voi palauttaa virhekoodeja, mutta rakentajakin voi heittää tarvittaessa poikkeuksen: public Koira(String v) throws NullPointerException { if (v == null ) throw new NullPointerException(); else... }

14.17 Exception -luokka Perii joitakin hyödyllisiä metodeja yliluokastaan: − printStackTrace : Tulostaa standardivirhevirtaan (oletusarvoisesti näytölle) virtuaalikoneen luoman virheilmoituksen. Ilmoitus on lähes sama kuin Javan ajonaikaisen virheen vuoksi tulostama virheilmoitus. − getStackTrace : Palauttaa StackTraceElement -luokan viitteen, jonka kautta poikkeuksen tietoja voidaan tutkia tarkemmin. − toString : Palauttaa poikkeusta kuvailevan merkkijonon. Ohjelmoija voi periä omia poikkeusluokkia.

14.18 Taulukon ja poikkeusten käsittelyä /* Lasketaan taulukon t paikoissa [a, b] olevien alkioiden summa. */ public static double laskeValinsumma( double [] t, int a, int b) { double summa = 0; try { // Tässä lohkossa voi tapahtua poikkeuksia. for ( int i = 0; i < b - a + 1; i++) summa += t[a + i]; } // Indeksiarvot a ja/tai b olivat virheellisiä. catch (ArrayIndexOutOfBoundsException e) { summa = Double.NaN; System.out.println(e.toString()); } // Taulukolle ei oltu varattu muistia (t == null). catch (NullPointerException e) { summa = Double.NaN; e.printStackTrace(); } return summa; } java.lang.ArrayIndexOutOfBoundsException: 5 java.lang.NullPointerException at TaulukkoPoikkeusDemo3.laskeValinsumma(TaulukkoPoikkeusDemo3.java:16) at TaulukkoPoikkeusDemo3.main(TaulukkoPoikkeusDemo3.java:33)