1 / 15

Poikkeukset ja niiden paikallistaminen *

Poikkeukset ja niiden paikallistaminen *. Jukka Juslin * Liittyy oppikirjan lukuun 11. Poikkeukset. Java-ohjelman suoritus voi keskeytyä poikkeustilanteeseen (engl. exception) Poikkeustilanteita on monentyyppisiä – perustyyppi kaikille poikkeuksille on Exception. Poikkeusten tarkoitus.

rania
Download Presentation

Poikkeukset ja niiden paikallistaminen *

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. Poikkeukset ja niiden paikallistaminen * Jukka Juslin * Liittyy oppikirjan lukuun 11

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

  3. 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. minkälainen ongelma tähän voi sisältyä? 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(); } }

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

  6. 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. 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. 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. 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. 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. 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. 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. Poikkeuksien eteenpäin heitteleminen 1 / 2 • Poikkeuksia voidaan heittää käsiteltäväksi eteenpäin metodista throws-avainsanalla • Esimerkiksi: publicvoidtarkistaDokumenttiluokka(String luokka) throwsVaaraDokumenttiLuokka { if (!luokka.equals("V") && !luokka.equals("L") && !luokka.equals("S")) { throw new VaaraDokumenttiLuokka(); } }

  14. 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. Omien poikkeusluokkien tekeminen • On mahdollista tehdä omia poikkeusluokkia, kun niiden alussa ilmoitetaan extendsException • 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

More Related