Poikkeuskäsittely

Download Report

Transcript Poikkeuskäsittely

Poikkeukset ja niiden paikallistaminen *
Jukka Juslin
* Liittyy oppikirjan lukuun 11
Jukka Juslin
Poikkeukset
 Java-ohjelman suoritus voi keskeytyä
poikkeustilanteeseen (engl. exception)
 Poikkeustilanteita on monentyyppisiä – perustyyppi
kaikille poikkeuksille on Exception
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ä
Jukka Juslin
Poikkeusesimerkki
package viikko12;
minkälainen
ongelma
tähän voi
sisältyä?
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();
}
}
Jukka Juslin
Edellinen ohjelma ”livenä”
Ohjelman kaatuminen
johtuu € merkistä, jota
numeronlukija ei
ymmärrä.
Jukka Juslin
Ohjelma kaatuu poikkeukseen
rivillä 9 – tämä on itseasiassa
hyperlinkki Eclipsessä, josta
pääset oikealle riville.
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
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();
}
}
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
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?
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ä.
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ä
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();
}
}
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();
}
}
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. stacktrace, 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
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
Jukka Juslin