Lataa esitys
Esittely latautuu. Ole hyvä ja odota
JulkaistuSatu Melasniemi Muutettu yli 9 vuotta sitten
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
Samankaltaiset esitykset
© 2023 SlidePlayer.fi Inc.
All rights reserved.