Lataa esitys
Esittely latautuu. Ole hyvä ja odota
JulkaistuMinna Seppälä Muutettu yli 9 vuotta sitten
1
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely
2
Poikkeukset Poikkeuksella tarkoitetaan yllättävää ajonaikaista tilannetta, joka estää ohjelman normaalin suorituksen. Esimerkkejä: nollalla jako avattavaa tiedostoa ei löydy saadaan syötteenä tekstiä, vaikka yritetään lukea kokonaisluku viitataan taulukon alkioon, jonka indeksi on indeksirajojen ulkopuolella. Vesa Ollikainen & Outi Grotenfelt220.9.2012
3
Poikkeusten ryhmät Javassa poikkeus on olio, joka luodaan ongelmatilanteen syntyessä. Poikkeusten ryhmät 1.tarkistettavat poikkeukset syntyvät tilanteissa, joihin hyvin kirjoitetun ohjelman on varauduttava (esim. virheellinen tiedostonimi) ohjelmoijan on määritettävä poikkeuksen käsittely (tarkistetaan käännösvaiheessa) 2.virheet järjestelmän väärä toiminta (esim. viallinen laite) poikkeukseen ei tarvitse/ei voi varautua 3.ajonaikaiset poikkeukset seurausta ohjelmointivirheistä pyritään välttämään, ei tarvitse varautua Virheitä ja ajonaikaisia poikkeuksia kutsutaan tarkistamattomiksi poikkeuksiksi. Vesa Ollikainen & Outi Grotenfelt320.9.2012
4
Esimerkki: nollalla jako Tarkastellaan esimerkkinä ohjelmaa, joka selvittää, montako makeista jokaiselle riittää, kun makeispussin sisältö jaetaan tasan. Esimerkeissä käytetään esimerkkinä poikkeuksesta ajonaikaista virhettä: nollalla jakoa. Nollalla jakoa käytetään esimerkissä yksinkertaisuuden vuoksi. Kyseiseen virhetilanteeseen olisi luontevampaa varautua ”perinteisin” keinoin. Toistorakenne syötteen kysymiseksi uudelleen, jos jakajana on nolla. Vesa Ollikainen & Outi Grotenfelt420.9.2012
5
Esimerkki: nollalla jako Esimerkissä makeisten määrä jaetaan ihmisten määrällä (kokonaisjako). Käyttäjä voi syöttää ihmisten määräksi nollan. Nolla aiheuttaa ArithmeticException -poikkeuksen. Vesa Ollikainen & Outi Grotenfelt520.9.2012 import java.util.*; public class Jakaja { public static Scanner input = new Scanner(System.in); public static void main(String[] args) { int lkm, henkilot, annos; System.out.print("Montako makeista pussissa on: "); lkm = input.nextInt(); System.out.print("Monelleko henkilölle ne jaetaan: "); henkilot = input.nextInt(); annos = lkm / henkilot; System.out.println("Jokainen saa "+annos+" makeista."); } run: Montako makeista pussissa on: 10 Monelleko henkilölle ne jaetaan: 0 Exception in thread "main" java.lang.ArithmeticException: / by zero at ekaesim.Jakaja.main(Jakaja.java:13) Java Result: 1 BUILD SUCCESSFUL (total time: 1 second)
6
Poikkeukseen varautuminen Riskialtis koodi kirjoitetaan try -lohkoon. Jos try -lohkon suoritus aiheuttaa poikkeuksen, hypätään catch -lohkoon, jossa poikkeus käsitellään. Vesa Ollikainen & Outi Grotenfelt620.9.2012 import java.util.*; public class Jakaja { public static Scanner input = new Scanner(System.in); public static void main(String[] args) { int lkm, henkilot, annos; System.out.print("Montako makeista pussissa on: "); lkm = input.nextInt(); System.out.print("Monelleko henkilölle ne jaetaan: "); henkilot = input.nextInt(); try { annos = lkm / henkilot; System.out.println("Jokainen saa "+annos+" makeista."); } catch (ArithmeticException e) { System.out.println(”Virhe: nollajako!”); } run: Montako makeista pussissa on: 10 Monelleko henkilölle ne jaetaan: 0 Virhe: nollajako! BUILD SUCCESSFUL (total time: 1 second)
7
try / catch -rakenne Vesa Ollikainen & Outi Grotenfelt720.9.2012 try { // riskialtis koodi } catch (poikkeustyyppi_1 e) { // poikkeustyypin 1 käsittely } catch (poikkeustyyppi_2 e) { // poikkeustyypin 2 käsittely } … catch (Exception e) { // kaikkien (muiden) poikkeustyyppien käsittely } finally { // lopetustoimenpiteet }
8
try / catch -rakenne Poikkeuksenkäsittelijöitä ( catch -lohkoja) voi olla useita Suoritettava käsittelijä määräytyy poikkeuksen tyypin mukaan Jos poikkeustyypiksi määritellään Exception, suoritetaan se kaikille poikkeuksille. Jos mukana on poikkeuskohtaisia käsittelijöitä, on yleinen käsittelijä kirjoitettava viimeiseen catch -lohkoon. Finally-lohkon toimenpiteet suoritetaan joka tapauksessa try -lohkon suorituksen jälkeen tai poikkeuksenkäsittelijän suorituksen jälkeen. Vesa Ollikainen & Outi Grotenfelt820.9.2012
9
Poikkeuksen siirto Poikkeus voidaan siirtää kutsuvan ohjelmanosan tai virtuaalikoneen käsiteltäväksi. throws -lauseella luetellaan siirrettävät poikkeukset. Vesa Ollikainen & Outi Grotenfelt920.9.2012 import java.util.*; public class Jakaja2 { public static void jaaKarkit() throws ArithmeticException{ int lkm, henkilot, annos; Scanner input = new Scanner(System.in); System.out.print("Montako makeista pussissa on: "); lkm = input.nextInt(); System.out.print("Monelleko henkilölle ne jaetaan: "); henkilot = input.nextInt(); annos = lkm / henkilot; System.out.println("Jokainen saa "+annos+" makeista."); }
10
Poikkeuksen käsittely kutsuvassa luokassa Siirretty poikkeus on käsiteltävä kutsuvassa lohkossa tai siirrettävä eteenpäin virtuaalikoneelle. Vesa Ollikainen & Outi Grotenfelt1020.9.2012
11
Oman poikkeusluokan luonti Oma poikkeusluokka määritetään Exception -luokan aliluokaksi. Jos poikkeusluokasta tehtäisiin RunTimeException -luokan aliluokka, ei käännösaikana vaadittaisi poikkeuksen sieppaamista. Varattu ohjelmointivirheille (APIn väärän käytön varalta) Poikkeuksen käsittelytoimenpiteet on kirjoitettu poikkeusluokan konstruktoriin. Tässä vasta luodaan poikkeusoliota, mutta ei tulosteta mitään. Poikkeusluokan konstruktori kutsuu yliluokan ( Exception ) konstruktoria, joka saa parametrinaan virheilmoituksen. Vesa Ollikainen & Outi Grotenfelt1120.9.2012
12
Oman poikkeusluokan käyttö Poikkeus luodaan throw-lauseella. Tarvittava poikkeusolio voidaan luoda samalla ( new ). Vesa Ollikainen & Outi Grotenfelt1220.9.2012
13
Oman poikkeusluokan käyttö Testiluokassa on käsiteltävä heitetty poikkeus tai siirrettävä se edelleen virtuaalikoneelle. Tässä kutsutaan poikkeusoliolle Exception -luokasta perittyä metodia printStackTrace. Metodi kutsuu poikkeusolion toString -metodia (jolla on nyt tieto poikkeukseen liitettävästä merkkijonosta). Tämän jälkeen printStackTrace -metodi kutsuu metodia, joka tulostaa odottavien metodien pinon Vesa Ollikainen & Outi Grotenfelt1320.9.2012
14
Tietovirrat Poikkeusten käsittely (erityisesti IOException ) on keskeistä tietovirtojen käytössä. Tietovirta on yksisuurtainen syöte- tai tulostevirta syötevirrasta luetaan tulostevirtaan tulostetaan Pakkaus java.io sisältää valmiita luokkia tietovirtojen käsittelyyn. Tietovirran käsittelyn vaiheet tietovirta luodaan (jolloin tiedosto avataan) tietoa luetaan yleensä toistorakenteen sisällä tiedosto suljetaan Virhetilanteiden synnyttämiin poikkeuksiin (esim. tiedosto puuttuu tai on tyhjä) on varauduttava. Vesa Ollikainen & Outi Grotenfelt1420.9.2012
15
Merkkipohjaiset tietovirrat FileReader -luokan avulla voidaan avata tiedosto. BufferedReader -oliosta voidaan lukea syötettä rivi kerrallaan. FileReader -olio annetaan parametrina. Rivin jäsentäminen voidaan tehdä String.split -metodin avulla Seuraava esimerkki lukee henkilöiden UTF-8-koodattua verenpainedataa ja tulostaa sen konsolille muotoiltuna. Vesa Ollikainen & Outi Grotenfelt1520.9.2012 Esimerkkitiedostoa:
16
Vesa Ollikainen & Outi Grotenfetl1620.9.2012 Esimerkki
17
Tietovirtojen käsittelystä Syötteen kirjoittamiseen on analogiset luokat FileWriter BufferedWriter Syötteitä ja tulosteita voidaan käsitellä myös tavupohjaisesti. FileInputStream / FileOutputStream tiedostoje käsittelemiseksi DataInputStream / DataOutputStream -luokat perustietotyyppien syöttämiseksi ja tulostamiseksi Vesa Ollikainen & Outi Grotenfelt1720.9.2012
18
Oliovirrat Oliovirtojen avulla voidaan lukea ja kirjoittaa ohjelmassa olevien olioiden tila pysyvää tallennusta varten. Tallennettavien olioiden on toteutettava Serializable -rajapinta. Lukeminen ja kirjoittaminen tapahtuu ObjectInputStream / ObjectOutputStream -luokkien avulla. Vesa Ollikainen & Outi Grotenfelt1820.9.2012
19
Esimerkki: Luokka, jonka olioita tallennetaan Vesa Ollikainen & Outi Grotenfelt1920.9.2012
20
Esimerkki: Tallennus ObjectOutputStream -luokan metodi writeObject kirjoittaa olion tilan. Vesa Ollikainen & Outi Grotenfelt2020.9.2012
21
Esimerkki: Luku ObjectInputStream -luokan metodi readObject lukee olion tilan. Vesa Ollikainen & Outi Grotenfelt2120.9.2012
22
THANK YOU! www.metropolia.fi/en/ www.facebook.com/MetropoliaAMK outi.grotenfelt@metropolia.fi
Samankaltaiset esitykset
© 2024 SlidePlayer.fi Inc.
All rights reserved.