Mitä poikkeuskäsittely tarkoittaa?

Samankaltaiset tiedostot
Poikkeustenkäsittely

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Java-kielen perusteita

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Metodien tekeminen Javalla

Listarakenne (ArrayList-luokka)

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Olio-ohjelmointi Virhetilanteiden käsittely

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Java-kielen perusteet

815338A Ohjelmointikielten periaatteet

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Java-kielen perusteita

Java-kielen perusteita

Olio-ohjelmointi Javalla

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Java-kielen perusteet

Java-kielen perusteet

Rajapinta (interface)

Taulukoiden käsittely Javalla

public static void main (String [] args)

Lista luokan sisällä

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Ohjelmointityö 3. Mikko Laamanen

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

8. Näppäimistöltä lukeminen 8.1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

12. Näppäimistöltä lukeminen 12.1

Luokan muodostimet (Constructors)

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

15. Ohjelmoinnin tekniikkaa 15.1

Metodien tekeminen Javalla

Java-API, rajapinnat, poikkeukset, UML,...

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

YHTEYSSUHDE (assosiation)

Ohjelmoinnin perusteet Y Python

8. Näppäimistöltä lukeminen 8.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Ohjelmoinnin jatkokurssi, kurssikoe

15. Ohjelmoinnin tekniikkaa 15.1

Periytyminen (inheritance)

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Sisältö. 22. Taulukot. Yleistä. Yleistä

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Ohjelmoinnin perusteet Y Python

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Ohjelmoinnin perusteet, kurssikoe

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Sisältö. 2. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

1 Tehtävän kuvaus ja analysointi

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

KOHDELUOKAN MÄÄRITTELY

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Java kahdessa tunnissa. Jyry Suvilehto

Seuraavassa on esimerkki for-, while- ja do-while -lauseesta:

Rinnakkaisohjelmointi, Syksy 2006

Ohjelmointi 2 / 2010 Välikoe / 26.3

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

Ohjelmointityö 65 Tekstinmuotoilu ohjelma. Dokumentaatio. Aki Heikkinen (155394)

7. Oliot ja viitteet 7.1

Mikä yhteyssuhde on?

Ohjelmoinnin perusteet Y Python

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

1. Omat operaatiot 1.1

Yksikkötestaus. Kattava testaus. Moduulitestaus. Ohjelman testaus. yksikkotestaus/ Seija Lahtinen

11. Javan toistorakenteet 11.1

Lauseet. Ehdollinen lause. Tämän osan sisältö. Ehdollinen lause. Esimerkkejä. Yksinkertainen ehto. Lohkosulut ja sisennys. Ehdollinen lause if

20. Javan omat luokat 20.1

Ohjelmoinnin perusteet Y Python

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Ohjelmoinnin perusteet, syksy 2006

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Ehto- ja toistolauseet

9. Periytyminen Javassa 9.1

Ohjelmoinnin perusteet Y Python

17. Javan omat luokat 17.1

Luokkakirjastot. esiintymämetodien käytöstä:

Javan GUI Scratchaajalle

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

UML ja luokkien väliset suhteet

Vahva koostumussuhde (Composition)

Transkriptio:

Poikkeuskäsittely Mitä poikkeuskäsittely tarkoittaa? Poikkeuskäsittelyluokkien hierakkia Poikkeuksen sieppaaminen Mihin järjestykseen try-catch-lauseen ExceptionType-poikkeukset laitetaan? Poikkeuksen heittäminen ja kiinniottaminen

Mitä poikkeuskäsittely tarkoittaa? Ohjelman suorituksen aikana tapahtuva virhe ohjelma kaatuu esim. pyydetään käyttäjältä kokonaislukua mutta käyttäjä antaa kirjaimia, pyydetään desimaalilukua desimaalipilkuin varustettuna, käyttäjä kirjoittaa desimaaliluvun desimaalipisteellä Ratkaisu: poikkeuskäsittely Joissain tilanteissa kääntäjä vaatii ohjelmaan poikkeuskäsittelyn esim. Kun ohjelma lukee/kirjoittaa tekstiä tiedostoon, ohjelmaan on määriteltävä, mitä tehdään ongelman ilmetessä On myös tilanteita, jossa kääntäjä ei vaadi erikoistoimenpiteitä, mutta jotka saattavat aiheuttaa ohjelman suoritusaikaisen virheen, esim. int luku = Integer.parseInt( kolme ); 2

Poikkeuskäsittelyluokkien hierakkia Vakavat peruttamattomat virheet, joihin ohjelmoija ei aina voi vaikuttaa Esim. Muistin loppuminen ohjelman suorituksen aikana Trowable Error Exception Ohjelmointivirheet ja ohjelman suoritusaikaiset virheet Esim. Viitataan taulukon rakojen ulkopuolelle IOException Tilanteet, joita ohjelmoija ei välttämättä tiedä etukäteen, mutta ne on huomioitava ohjelmakoodissa. Esim. yritys lukea tiedoston lopun yli, yritys hakea verkosta olematonta resurssia. RuntimeException 3

Poikkeuskäsittelyluokkien hierakkia jatkuu : RuntimeException IndexOutOfBoundsException IllegalArgumentException NullPointerException ArithmeticException NumberFormatException ArrayIndexOutOfBounds- Exception 4

Poikkeuksen sieppaaminen try/catch-lause poikkeusten käsittely hoidetaan try/catch-lauseella, jolloin erityyppiset virheet voidaan halutessa tunnistaa try { // lauseet, jotka saattavat aiheuttaa poikkeuksia catch (ExceptionType1 poikkeus1) { // lauseet ExceptionType1 poikkeuksen korjaamiseen catch (ExceptionTYpe2 poikkeus2) { // lauseet ExceptionType2 poikkeuksen korjaamiseen // tänne tullaan poikkeustilanteessa catch-lohkosta // tai // try-lohkosta, kun poikkeuskäsittelyä ei ole tarvinnut tehdä 5

Poikkeuksen sieppaaminen jatkuu Jos jokin try-lohkon lauseista aiheuttaa poikkeuksen, joka kuuluu johonkin catch-lohkoissa määriteltyyn ExceptionType luokkaan: - try-lohkon loppuosa jää suorittamatta - Siirrytään ko. catch-lohkooon ja suoritettaan lohkon lauseet - jatketaan catch-lohkojen jälkeen olevasta lauseesta Jos try-lohkon mikään lause ei aiheuta poikkeusta: - suoritetaan try-lohko loppuun, - sivutetaan kaikki catch-lohkot - jatketaan catch-lohkojen jälkeen olevasta lauseesta 6

Mihin järjestykseen try-catch-lauseen ExceptionTypepoikkeukset laitetaan? Mitä korkeammalla periytymishierarkiaa poikkeus on, sitä laajempi vaikutus sillä on Ensin tulee periytymishierakian alimmat poikkeukset sitten vasta ylimmät 7

public void aja() { Voiko merkkijonon muuttaa kokonaisluvuksi? Jos ei, lause heittää NumberFormat Exceptionpoikkeuksen Esim. int kluku = 0; double dluku = 0; String mjono = null; try { System.out.println( Anna desimaaliluku: "); dluku = input.nextdouble(); //KRIITTINEN LAUSE mjono = "" + dluku; kluku = Integer.parseInt(mjono); //KRIITTINEN LAUSE catch (NumberFormatException e1) { System.out.println(mjono + " ei ole kokonaisluku!"); catch (Exception e2) { nextdouble-metodi aiheuttaa seuraavat poikkeukset: InputMismatch-Exception tai NoSuchElement-Exception tai IllegalState-Exception System.out.println("et antanut desimaalilukua + pilkulla varustettuna!!!!"); input.nextline(); // tyhjennä syöttöpuskuri 8

Esim. public class KymmenenLukua { private Scanner input ; private ArrayList <Integer> kluvut ; private ArrayList <Double> dluvut; private final int LKM = 5; public KymmenenLukua() { input = new Scanner (System.in); kluvut = new ArrayList<Integer>(); dluvut = new ArrayList<Double>(); public void aja() { luedesimaaliluvut(); luekokonaisluvut(); tulostaluvut(); 9

Esim. jatkuu private void luedesimaaliluvut(){// Lukee 5 desimaalukua int i=0; double apu;; String rivi; while (dluvut!= null && i < LKM) { System.out.print("Anna " + (i+1)+". desimaaliluku: " ); rivi = input.nextline(); rivi = rivi.trim(); try { apu = Double.parseDouble(rivi); //KRIITTINEN LAUSE dluvut.add(apu); i++; catch(exception e){ System.out.println("Anna desimaaliluku numeroina" + " ja desimaalipisteellä"); 10

Esim. jatkuu private void luekokonaisluvut () { // Lukee 5 kokonaislukua int i=0; int apu;; String rivi; while (kluvut!= null && i < LKM){ System.out.print("Anna " + (i+1)+". kokonaisluku: " ); rivi = input.nextline(); rivi = rivi.trim(); try { apu = Integer.parseInt(rivi); //KRIITTINEN LAUSE kluvut.add(apu); i++; catch(exception e){ System.out.println("Anna kokonaisluku numeroina"); 11

Esim. jatkuu.. private void tulostaluvut() { // tulostaa taulukon luvut muodossa int i=0; // 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 int apu; System.out.print("Antamasi desimaalluvut ovat: "); while (i < dluvut.size() - 1) { System.out.print(dluvut.get(i) + ", "); i++; System.out.println(dluvut.get(i)); // tulosta viimeinen luku System.out.print("Antamasi kokonaisluvut ovat:"); Iterator<Integer> it = kluvut.iterator(); while (it.hasnext()) { apu = it.next(); if (it.hasnext()) // onko kyseessä viimeinen alkio? System.out.print(apu + ", "); // EI else System.out.println(apu); // ON 12

Esim. jatkuu tulostuu: Anna 1. desimaaliluku: 4,5 Anna desimaaliluku numeroina ja desimaalipisteellä Anna 1. desimaaliluku: 4.5 Anna 2. desimaaliluku: kolme Anna desimaaliluku numeroina ja desimaalipisteellä Anna 2. desimaaliluku: 3 Anna 3. desimaaliluku: 5.7 Anna 4. desimaaliluku: 23.5 Anna 5. desimaaliluku: 1.6 Anna 1. kokonaisluku: 5.6 Anna kokonaisluku numeroina Anna 1. kokonaisluku: 5 Anna 2. kokonaisluku: kolme Anna kokonaisluku numeroina Anna 2. kokonaisluku: 3 Anna 3. kokonaisluku: 0 Anna 4. kokonaisluku: -2 Anna 5. kokonaisluku: 3 Antamasi desimaaliluvut ovat: 4.5, 3.0, 5.7, 23.5, 1.6 Antamasi kokonaisluvut ovat: 5, 3, 0, -2, 3 13

Tuntitehtävä Tee ohjelma PalkkaOhjelma.java, joka pyytää 5 palkkaa ja tulostaa palkkojen keskiarvon. Ohjelmaa pyytää palkkoja varautuen käyttäjän antamiin virheellisiin arvoihin. 14

printstacktrace() Throwable-luokan metodi tulostaa poikkeustilanteessa pinon sisällön Seuraavat lauseet sieppaavat minkä tahansa poikkeuksen: try { // lauseet jotka saattavat aiheuttaa poikkeuksia catch (Exception e) { e.printstacktrace(); 15

public class Esimerkki{ public void aja() { printstacktrace() jatkuu Scanner input = new Scanner (System.in); int luku1, luku2; String mjono; try { System.out.print ("Anna 1. luku: "); mjono = input.nextline(); luku1 = Integer.parseInt(mjono); // KRIITTINEN LAUSE System.out.print ("Anna 2. luku: "); mjono = input.nextline(); luku2 = Integer.parseInt(mjono);// KRIITTINEN LAUSE System.out.println (luku1 / luku2); // KRIITTINEN L catch (Exception e){ System.out.println("\n***VIRHE***"); e.printstacktrace(); 16

Ohjelman suoritus 1.suorituskerta Anna 1. luku: ensimmäinen ***VIRHE*** java.lang.numberformatexception: For input string: "ensimmäinen" at java.lang.numberformatexception.forinputstring(unknown Source) at java.lang.integer.parseint(unknown Source) at java.lang.integer.parseint(unknown Source) at luku9.esimerkki.aja(esimerkki.java:16) at luku9.esimerkki.main(esimerkki.java:34 2. suorituskerta Anna 1. luku: 2 Anna 2. luku: 0 ***VIRHE*** java.lang.arithmeticexception: / by zero at luku9.esimerkki.aja(esimerkki.java:22) at luku9.esimerkki.main(esimerkki.java:34) 17

Tuntitehtävä Tee ohjelma, Poikkeuskokeilu, joka pyytää käyttäjältä kokonaisluvun, lukee luvun Scanner-luokan nextint-metodin avulla ja tulostaa luvun. Jos käyttäjä antaa kokonaisluvun tilalle kirjaimia tai desimaaliluvun, ohjelma ilmoittaa virheen poikkeuksen printstacktrace-metodin avulla. Kokonaisluvun lukemisen jälkeen ohjelma pyytää desimaaliluvun ja lukee sen Scanner-luokan nextdouble-metodin avulla ja tulostaa luvun. Jos käyttäjä antaa desimaaluvun tilalle kirjaimia tai desimaaliluvun desimaalipisteellä, ohjelma ilmoittaa virheen poikkeuksen printstacktrace-metodin avulla. 18

Poikkeuksen heittäminen ja kiinniottaminen Poikkeus voidaan heittää luomalla poikkeusolio ja heittämällä se lauseella throw poikkeus Metodi voi heittää poikkeuksen, mikä edellyttää sitä, että kutsuja ottaa poikkeuksen kiinni eli metodin kutsu pitää olla try-catch-lauseessa try:n sisällä Jos metodi heittää poikkeuksen se on esiteltävä seuraavasti: näkyvyys paluu metodinimi(parametrit) throws poikkeus 1, poikkeus 2,...,poikkeus n 19

Poikkeuksen heittäminen esimerkki public class PoikkeuksenHeitto { private Scanner input; public PoikkeuksenHeitto(){ input = new Scanner (System.in); private int pyydaluku () throws Exception { int luku = 0; System.out.println("Anna kokonaisluku, ei nolla: "); try{ luku = input.nextint(); // KRIITTINEN LAUSE if (luku ==0) throw new Exception(); // luku!= 0 luo poikkeus ja heitä se catch (Exception e){ input.nextline(); throw e; return luku; // tyhjennä syöttöpuskuri // heitä poikkeus eteenpäin 20

Poikkeuksen heittäminen esimerkki jatkuu. public void aja() { boolean ok = true; int luku=0; do { try { luku =pyydaluku(); // KRIITTINEN LAUSE ok=true; catch (Exception e) { System.out.println("Anna numeroita (> 0)!"); ok =false; while (ok == false); System.out.println("annoit " + luku); 21

Poikkeuksen heittäminen esimerkin toteutus tulostuu: Anna kokonaisluku, ei nolla: kolme Anna numeroita! Anna kokonaisluku, ei nolla: 0 Anna numeroita! Anna kokonaisluku, ei nolla: 3 annoit 3 22

Tuntitehtävä: Muokkaa ohjelmaa LaskeJaTulostakertotaulu. Lisää ohjelman metodiin lueluku() poikkeuskäsittely, eli kun käyttäjä antaa kelvottoman kokonaisluvun, metodi heittää poikkeuksen metodin kutsujalle. Kutsuja ilmoittaa virheestä ja pyytää uutta kokonaislukua (lueluku-metodin kutsu), kunnes saa kelvollisen. 23