1 / 16

Unntakshåndtering

Unntakshåndtering. Unntak, generelt side 2-4 Unntaksobjekt side 5 Programflyt når unntaksobjekt blir laget side 6-7 Tre typer unntaksobjekt side 8 Unntakshåndtering for nybegynnere side 9 Unntakssituasjoner som ikke bør inntreffe

yuki
Download Presentation

Unntakshåndtering

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. Unntakshåndtering Unntak, generelt side 2-4 Unntaksobjekt side 5 Programflyt når unntaksobjekt blir laget side 6-7 Tre typer unntaksobjekt side 8 Unntakshåndtering for nybegynnere side 9 Unntakssituasjoner som ikke bør inntreffe Subklasser til RunTimeException side 10 try-setningen side 11-15 Å lage egne unntaksobjekter side 16 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  2. Unntak • Et unntak er en tilstand som kan opptre under kjøring, men som er avvik fra det mest normale. Eksempler: • divisjon med null, å finne kvadratrota eller logaritmen til et negativt tall, eller andre matematiske “umuligheter” • å hente ut et tegn på en ugyldig posisjon i en streng. Eksempel: I strengen “Eksempel” er 0, 1, 2, 3,..,7 gyldige posisjoner, men posisjon 8 ikke er gyldig. • brukeren skriver ”yes” som svar når programmet forventer ”ja” eller ”nei” • Så langt det er mulig, må vi lage programmene slik at denne typen unntak håndteres. Vi må unngå at brukeren får en melding på skjermen, og programmet stopper, eller at programmet gjør andre feil. • Eksempel på kontroll av inndata (fra kap. 6): String tekst = showInputDialog(ledetekst); while (tekst == null || tekst.trim().equals("")) { showMessageDialog(null, "Du må oppgi data."); tekst = showInputDialog(ledetekst); } Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  3. En klient sender en melding til et tjenerobjekt. Dersom ting går galt, skal vanligvis ikke tjeneren selv skrive ut en feilmelding, men i stedet sende en melding tilbake til klienten, eksempelvis returnere en tallverdi som ikke er blant de som returneres ved normale forhold returnere false dersom data ellers ikke skal returneres fra metoden På denne måten bestemmer klienten hva som skal skje videre. Eksempel, klassen Eksamensresultat til høyre. Klient: class Eksamensresultat { private int poeng; public Eksamensresultat(int startPoeng) { poeng = startPoeng; } public char finnKarakter() { if (poeng > 100) return 'Y'; // for stor poengsum else if (poeng >= 96) return 'A'; else if (poeng >= 86) return 'B'; else if (poeng >= 71) return 'C'; else if (poeng >= 55) return 'D'; else if (poeng >= 35) return 'E'; else if (poeng >= 0) return 'F'; else return 'X'; // for liten poengsum } } Hva hvis et tjenerobjekt ikke klarer å utføre oppgaven sin? • Eksamensresultat resultat = new Eksamensresultat(poeng); • char karakter = resultat.finnKarakter(); • if (karakter == 'X') showMessageDialog(null, "For liten poengsum."); • else if (karakter == 'Y') showMessageDialog(null, "For stor poengsum."); • else showMessageDialog(null, "Karakteren blir " + karakter); Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  4. Hvorfor er ikke metoden beskrevet foran god nok? • Av og til kan ikke feilhåndteringsmetoden beskrevet foran brukes: • Hva hvis alle mulige tegn er gyldige returverdier fra metoden finnKarakter()? • Andre ganger er det svært tungvindt å håndtere feil ved hjelp av returverdier. Eksempel: Et program som leser data fra en fil. Feil kan inntreffe hver gang programmet skal ha kontakt med filen: opprett kontakt med filenif dette gikk bra les litt data fra filenwhile dette gikk bra og mere data les data fra filen (sjekk om det gikk bra etter hver eneste lesing) bryt forbindelsen med filen Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  5. Unntaksobjekt • Et unntaksobjekt er et objekt som inneholder informasjon om feilen. Dersom noe går galt inne i en metode, kastes et unntaksobjekt ut av metoden. Dette objektet kommer ikke via returverdien fra metoden. • Klienten kan ta i mot dette objektet eller kaste det videre. • Programskissen foran vil nå se slik ut: prøvopprett kontakt med filen (exception-objekt kan kastes)les litt data fra filen (exception-objekt kan kastes)while mere data les data fra filen (exception-objekt kan kastes)bryt forbindelsen med filen (exception-objekt kan kastes) fang eventuelle exception-objektfelles håndtering av feil • prøv – kast – fang try – throw - catch Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  6. main() fanger et unntaksobjekt som er generert i hentData() public …. hentData() throws Exception { …setninger... hvis feil oppstått throw new Exception …setninger... } public static void main() { try { …setninger… filobjekt.hentData(); …setninger... } catch (Exception e) { ..gjør noe fornuftig, parameteren e er en referanse til unntaksobjektet… } } nytt unntaksobjekt blir laget Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  7. metodeX() mottar et exception-objekt fra hentData().metodeX() kaster dette videre til main(). 1 public ... metodeX() throws Exception { …setninger…filobjekt.hentData(); …setninger... } public …. hentData() throws Exception { …setninger... hvis feil oppstått throw new Exception …setninger... } 3 2 4 public static void main() { try { …setninger… etObjekt.metodeX(); …setninger... } catch (Exception e) { ..gjør noe fornuftig, parameteren e er en referanse unntaksobjektet... } } nytt unntaksobjekt blir laget Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  8. Det finnes tre ulike typer unntaksobjekt Object 3. Disse unntakene må håndteres med try og catch,eller kastes ut av metoden Throwable 2. Interne feil, kan ikke gjøre noe med disse Exception Error VirtualMachineError . . . . . . . . . IOException SQLException RuntimeException 1. Bør skrive programmet slik at disse unngås 1 & 2: usjekkede unntak3: sjekkede unntak AritmeticException NullPointerException . . . Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  9. Unntakshåndtering for nybegynnere • Dersom kompilatoren sier at unntaket må fanges eller kastes videre, er det enklest å kaste det videre. Skriv throws Exception i metodehodet. • Dersom unntaket viser seg ved at programmet stopper under kjøring, bør du prøve å endre programmet slik at det ikke inntreffer. • Eksempel: public ArrayList<Person> hentData() throws Exception { ArrayList<Person> alle = new ArrayList<Person>(); .. les data fra fil ... return alle; } Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  10. Unntakssituasjoner som ikke bør inntreffe i et program(subklasser til RuntimeException, gruppe 1 foran) • Vi må skrive programmene våre slik at unntak av denne typen ikke inntreffer. Kjente eksempler: • ArithmeticException kastes dersom vi forsøker å dividere et heltall med null. • Test at nevneren ikke er null før divisjonen utføres. (if (nevner != 0)…) • NullPointerException kastes dersom en referanse brukes før den er satt til å peke til et konkret objekt. • Pass på at alle referanser peker til objekt før de brukes. • StringIndexOutOfBoundsException kastes av charAt() i klassen String dersom argumentet er ugyldig. • Test at argumentet har gyldig verdi før du sender meldingen charAt() til en streng. (if (pos >= 0 && pos < tekst.length())…. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  11. try-setningen try { setninger } catch (parameter) { setninger } catch (parameter) { setninger } finally { setninger } Ingen unntak kastes utfør finally-blokken utfør setningene etter try-setningen Unntak kastes Hvis catch-blokk passer, utfør den, utfør finally-blokk utfør setningene etter try-setningen ellers utfør finally-blokk hopp ut av metoden med unntaksobjektet // utføres alltid Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  12. try-setningen, forts • try-setningen brukes dersom vi skal behandle unntaket som inntreffer • Eksempel: class HandterNavneregister { public static void main(String[] args) { try { … filhåndtering … } catch (Exception e) { System.out.println("Programutførelsen er avbrutt: " + e); // toString() underforstått } } • Hvis f.eks. filen ikke finnes, kommer følgende melding: Programutførelsen er avbrutt: java.io.FileNotFoundException: navnefil.txt(Systemet finner ikke angitt fil) • Unntaksobjektet er kastet gjennom flere metoder, detaljer kan du få slik: } catch (Exception e) { System.out.println("Programutførelsen er avbrutt: "); e.printStackTrace();// stakk-utskrift, se ø. side 416 } Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  13. Mer enn én catch-blokk • Parameteren i blokkene må være av typen Throwable eller en subklasse til denne. • Parametrene må være forskjellige. • Blokker med mer spesifikk parameter plasseres foran de med mer generell parameter. public static void main(String[] args) { String filnavn = "tallfil.txt"; try { ... opprett forbindelse til datafil, FileNotFoundException m.fl. kan bli kastet ... double sum = 0; try { ... les tall fra filen, IOException kastes dersom leseproblemer ... ... InputMismatchException hvis problemer med å tolke teksten som tall ... } catch (InputMismatchException e) { System.out.println("Feil ved omforming til tall."); } ... lukking av fil, IOException kan kastes ... } catch (FileNotFoundException e) { System.out.println("Fil ikke funnet: " + filnavn); } catch (IOException e) { System.out.println("IO-Feil ved åpning/lukking av fil: " + filnavn); } } Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  14. finally • Innholdet i en finally-blokk utføres uansett utgang fra en metode public boolean endreNavn(Person personen) { .. diverse intieringer ... Statement setning = null; try { setning = forbindelse.createStatement(); if (setning.executeUpdate(sqlsetning) == 0) return false; else return true; } catch (SQLException e) { skrivMelding(e, "endreNavn()"); } finally { lukkSetning(setning); // utføres selv om det er return-setninger rett over } return false; } Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  15. finally, forts. • Et eksempel til: public boolean endreNavn(Person personen) throws SQLException { .. diverse intieringer ... Statement setning = null; try { setning = forbindelse.createStatement(); if (setning.executeUpdate(sqlsetning) == 0) return false; else return true; } finally { lukkSetning(setning); // utføres selv om det er return-setninger rett over } } Gjør oppgave 1 side 418. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  16. Å lage egne unntaksobjekter - Vis programliste 11.1 side 420-421. Kan også lage egen unntaksklasse class UgyldigAnsattdataException extends Exception { public UgyldigAnsattdataException() { super("Ugyldige ansattdata"); // kaller konstruktøren i superklassen } public UgyldigAnsattdataException(String melding) { super(melding); // kaller konstruktøren i superklassen } } Endrer i konstruktøren public Ansatt(int startNr, String startNavn, double startLønn) throws UgyldigAnsattdataException { if (startLønn < minLønn) { throw new UgyldigAnsattdataException("Lønn: " + startLønn + "\nLønnen skal være minst " + pengeformat.format(minLønn)); } else if (startNr < nedreGrenseNr || startNr > øvreGrenseNr) { throw new UgyldigAnsattdataException("Nummer: " + startNr + "\nAnsatt-nummeret må ligge i intervallet [" + nedreGrenseNr + ", " + øvreGrenseNr + "]."); } else …. Og i klientprogrammet try { ... } catch (UgyldigAnsattdataException e) { ... Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

More Related