Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Jukka Juslin Poikkeukset ja niiden paikallistaminen * Jukka Juslin * Liittyy oppikirjan lukuun 11.

Samankaltaiset esitykset


Esitys aiheesta: "Jukka Juslin Poikkeukset ja niiden paikallistaminen * Jukka Juslin * Liittyy oppikirjan lukuun 11."— Esityksen transkriptio:

1 Jukka Juslin Poikkeukset ja niiden paikallistaminen * Jukka Juslin * Liittyy oppikirjan lukuun 11

2 Jukka Juslin Poikkeukset  Java-ohjelman suoritus voi keskeytyä poikkeustilanteeseen (engl. exception)  Poikkeustilanteita on monentyyppisiä – perustyyppi kaikille poikkeuksille on Exception

3 Jukka Juslin Poikkeusten tarkoitus  Java-ohjelman aiheuttaman poikkeuksen idea on hallitusti käsitellä ongelmatilanne  Jos poikkeus ns. otetaan kiinni ja käsitellään voidaan suoritusta jatkaa normaalisti  Tarkastellaan seuraavaa esimerkkiä

4 Jukka Juslin Poikkeusesimerkki package viikko12; import java.util.Scanner; public class Hinta { public void aja() { Scanner scan = new Scanner(System.in); System.out.println(”Anna ALV 0 hinta (esim. 12€):”); double hinta = scan.nextDouble(); System.out.println(”Hinta ALV 22%: ” + (1.22*hinta)); } public static void main(String[] args) { Hinta hinta = new Hinta(); hinta.aja(); } minkälainen ongelma tähän voi sisältyä?

5 Jukka Juslin Edellinen ohjelma ”livenä” Ohjelma kaatuu poikkeukseen rivillä 9 – tämä on itseasiassa hyperlinkki Eclipsessä, josta pääset oikealle riville. Ohjelman kaatuminen johtuu € merkistä, jota numeronlukija ei ymmärrä.

6 Jukka Juslin Ohjelman korjaaminen – poikkeuksen käsittely  Edellinen ohjelma voidaan korjata lisäämällä poikkeuksenkäsittely  Poikkeuskäsittely tehdään yleensä aina lisäämällä try { } lohko, jossa mahdollisesti tapahtuva poikkeus otetaan kiinni catch -lohkossa  Seuraavalla kalvolla näet aikaisemman ohjelman korjattuna

7 Jukka Juslin package viikko12; import java.util.Scanner; public class Hinta { public void aja() { Scanner scan = new Scanner(System.in); System.out.println(”Anna ALV 0 hinta (esim. 12€):”); try { double hinta = scan.nextDouble(); System.out.println(”Hinta ALV 22%: ” + (1.22*hinta)); } catch(InputMismatchException ex) { System.out.println(”Syötit virheellisen luvun.”); } public static void main(String[] args) { Hinta hinta = new Hinta(); hinta.aja(); }

8 Jukka Juslin Lisäongelmia edelliseen esimerkkiin (1 / 2)  Joskus on mahdollista, että ohjelma jää ikisilmukkaan kun scanneriin jäänyt ylimääräinen enter jää lukematta  Olisi syytä aina numeroita luettaessa lukea ylimääräisellä scan.nextLine()-komennolla turha enter pois puskurista

9 Jukka Juslin Lisäongelmia edelliseen esimerkkiin (2 / 2)  Jotkin toiminnot on usein tehtävä siitä huolimatta onnistuiko syötteen lukeminen vai ei  Näinollen scan.nextLine()-komennon voisi sijoittaa finally-lauseeseen  Lisäksi voi miettiä miten tulee toimia, jos halutaan että ohjelma kysyy oikeaa syötettä niin kauan kunnes se annetaan?

10 Jukka Juslin Luentoharjoitus  Tee ohjelma PalkkaOhjelma.java, joka kysyy palkkoja. Jos palkka saadaan tekstimuodossa ohjelma kysyy uutta palkkaa niin kauan kunnes palkka saadaan oikeassa muodossaan. Palkat ovat desimaalukuja, eli siis double-tyyppiä.

11 Jukka Juslin Pakollinen virheentarkistus vs. ei pakollinen  Jossain tilanteissa on pakollista tehdä virheenkäsittely, esimerkiksi avattaessa tiedostoa Java-ohjelmasta käsin Scanner-luokkaa apunakäyttäen  Toisissa tilanteissa taas Scanner ei vaadi virheentarkistusta, kuten on näppäimistöltä luettavan syötteen tapauksessa – tämä on todennäköisesti tehty sen vuoksi että olisi helpompi kirjoittaa koodi, joka lukee näppäimistöltä

12 Jukka Juslin package viikko12; import java.util.Scanner; public class PakollisestiKasiteltavaPoikkeus { public void aja() { Scanner scan = new Scanner(new File(”lokitiedosto.txt”); scan.println(”testikirjoitus”); scan.close(); } public static void main(String[] args) { PakollisestiKasiteltavaPoikkeus poikkeus = new PakollisestiKasiteltavaPoikkeus(); poikkeus.aja(); }

13 Jukka Juslin Poikkeuksien eteenpäin heitteleminen 1 / 2  Poikkeuksia voidaan heittää käsiteltäväksi eteenpäin metodista throws-avainsanalla  Esimerkiksi: public void tarkistaDokumenttiluokka(String luokka) throws VaaraDokumenttiLuokka { if (!luokka.equals("V") && !luokka.equals("L") && !luokka.equals("S")) { throw new VaaraDokumenttiLuokka(); }

14 Jukka Juslin Poikkeuksien eteenpäin heitteleminen 2 / 2  Poikkeus päätyy lopulta komentorivipohjaisessa sovelluksessa main-metodiin, jos sitä ei aikaisemmin käsitellä  Jos poikkeusta ei käsitellä saadaan Eclipseen ns. stack- trace, jossa näkyy metodikutsujen ketju (pino) joissa viimeisenä tasona on kyseisen sovelluksen main-metodi  Stacktraceen voi tulla myös Javan sisäisen toteutuksen luokkia, jotka eivät ole ohjelmoijan itse tekemiä  Stractracen ilmoittamaan kohtaan päästään klikkaamalla kyseistä kohtaa

15 Jukka Juslin Omien poikkeusluokkien tekeminen  On mahdollista tehdä omia poikkeusluokkia, kun niiden alussa ilmoitetaan extends Exception  Kyseinen vaatii kuitenkin periytymisen käyttämistä ja periytymistä ei tällä kurssilla juuri käsitellä  Kaikkien poikkeuksien kantaluokka on siis Exception, ja kuten ehkä aikaisemmasta huomattiin sillä saadaan pyydystettyä mikä tahansa poikkeustilanne


Lataa ppt "Jukka Juslin Poikkeukset ja niiden paikallistaminen * Jukka Juslin * Liittyy oppikirjan lukuun 11."

Samankaltaiset esitykset


Iklan oleh Google