Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Like dokumenter
Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

Oversikt. Array indeks utenfor sine grenser. Feil i programmet hva skjer?

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

INF1010 våren 2018 tirsdag 23. januar

INF1010, 8. mars Om klassehierarkier, grensesnitt (interface) og multippel arv. Konstruktører i subklasser. Unntak.

INF1010 våren Arv og subklasser del 1 (pluss litt I/O og unntaksbehandling)

INF1010 våren Arv og subklasser - del 2

INF 1010, vår 2005 Løsningsforslag uke 11

Kapittel 11: Unntakshåndtering. Java som første programmeringsspråk

INF1010 våren Arv og subklasser del 1 pluss (hvis vi har tid) litt om Unntak, IO og Scanner-klassen

Videregående programmering 6

Kapittel 13: Unntakshåndtering

Kapittel 13: Unntakshåndtering

Kapittel 11: Unntakshåndtering. Java som første programmeringsspråk

Læringsmål for forelesningen

INF1010 våren Generalisering -spesialisering Gjenbruk av klasser. Ved arv. Klasse-hierarkier. Stein Gjessing.

Klasser skal lages slik at de i minst mulig grad er avhengig av at klienten gjør bestemte ting STOL ALDRI PÅ KLIENTEN!

Leksjon 7. Filer og unntak

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Enkle generiske klasser i Java

Uke 5, 27. januar Arv og subklasser del I. Stein Gjessing Institutt for informatikk

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Jentetreff INF1000 Debugging i Java

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

INF1010 våren Arv og subklasser - del 2

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

2 Om statiske variable/konstanter og statiske metoder.

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

INF1010 våren Arv og subklasser, del 2

INF1000: Forelesning 7. Konstruktører Static

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

INF1000: Forelesning 7

Sortering med tråder - Quicksort

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Forelesning inf Java 5

Forelesning inf Java 5

2 Om statiske variable/konstanter og statiske metoder.

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

D Feilhåndtering og unntaksklasser

INF1010 våren januar. Objektorientering i Java

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

IN1010 våren 2018 Tirsdag 6. februar. Arv og subklasser - del 2

INF1010 våren 2017 Torsdag 2. februar. Arv og subklasser - del 2

INF1000: Forelesning 6. Klasser og objekter del 1

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser - del 2

Repetisjon. INF gruppe 13

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

INF1010 våren Arv og subklasser del 1

IN1010 våren januar. Objektorientering i Java

Forelesning inf Java 4

TOD063 Datastrukturer og algoritmer

INF Uke 10. Ukesoppgaver oktober 2012

Gjennomgang av eksamen H99

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

INF1010. Grensesnittet Comparable<T>

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

INF1000 : Forelesning 4

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

(MVC - Model, View, Control)

INF1010 våren Arv og subklasser del 1

UNIVERSITETET I OSLO

Hvordan skrive Flok og Flass kode? I mange tilfelle er det svært enkelt:

INF1000: noen avsluttende ord

INF1010 våren Arv, subklasser og grensesnitt - del 2

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

IN 211 Programmeringsspråk. Java. på 20 enkle ark. spesielt for de som kan. Simula. (og gjerne litt C) Ark 1 av 20

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Dagens tema Kapittel 8: Objekter og klasser

INF1010 våren 2010 Torsdag 4. februar. Arv og subklasser del I. Emneoversikt subklasser (2 uker) Hva er en subklasse? Eksempel: Universitetsregister


Hva er en metode. Hva skjer når vi kaller en metode

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

INF1010 våren Arv og subklasser del I

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

UNIVERSITETET I OSLO

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Del 3: Evaluere uttrykk

Blokker og metoder INF1000 (Uke 6) Metoder

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Fra Python til Java, del 2

INF Notater. Veronika Heimsbakk 10. juni 2012

Transkript:

INF1010 Våren 2015 Feilsituasjoner og unntak i Java (Engelsk: Exception) Stein Gjessing, Institutt for informatikk, Universitetet i Oslo 1

Jeg prøvde å bestille billett med Air France: <LINK rel="stylesheet" href="/no/common/common/css/headerfooter. java.util.nosuchelementexception at java.util.abstractlist$itr.next(abstractlist.java:426) at com.airfrance.pce.resainfovol.infovols.bean.actuvolsbean.getnextvol(unknown Source) at NO.en.local.resainfovol.infovols._0002fNO_jsp_0._jspService (_0005fvol_jsp_0.java:555) at org.apache.jasper.runtime.httpjspbase.service(httpjspbase.java:126) at javax.servlet.http.httpservlet.service(httpservlet.java:853) at org.apache.jasper.runtime.jspservlet$jspservletwrapper.service(jspservlet.java:174) at org.apache.jasper.runtime.jspservlet.servicejspfile(jspservlet.java:274) at org.apache.jasper.runtime.jspservlet.service(jspservlet.java:387) at javax.servlet.http.httpservlet.service(httpservlet.java:853) at com.broadvision.servlet.servletcontainer.service(servletcontainer.java:415) at com.broadvision.servlet.bvrequestdispatcher.forward(bvrequestdispatcher.java:143) at org.apache.struts.action.requestprocessor.doforward(requestprocessor.java:1069) at com.airfrance.struts.action.afrequestprocessor.processforwardconfig(afrequestprocessor.java:146) at org.apache.struts.action.requestprocessor.process(requestprocessor.java:279) at org.apache.struts.action.actionservlet.process(actionservlet.java:1482) at com.airfrance.struts.action.afactionservlet.process(unknown Source) at org.apache.struts.action.actionservlet.dopost(actionservlet.java:525) at javax.servlet.http.httpservlet.service(httpservlet.java:760) at javax.servlet.http.httpservlet.service(httpservlet.java:853) at com.broadvision.servlet.servletcontainer.service(servletcontainer.java:415) at com.broadvision.servlet.servletcontainer.processrequest(servletcontainer.java:359) at com.broadvision.servlet.servletcontextcontainer.processrequest(servletcontextcontainer.java:825) at com.broadvision.servlet.bvservletengine.service(bvservletengine.java:255) at com.broadvision.servlet.bvservletconnector.service(bvservletconnector.java:151) 2 2

Og jeg skulle sjekke når T- banen går Avganger fra Nationaltheatret [T-bane] Klokka er: 17:15:34 Linje Mot Plf Avgangstid Merknad Microsoft VBScript runtime error '800a01a8' Object () 253:46 required: 'ObjXML.do cumentelem ent' / Common.as p, line 331 3

Oversikt Hva er en feil (er det ikke mulig å unngå feil?) Hva skjer når et program feiler Mål 1: Å ikke få feilmeldinger fra kjøretidsystemet, men isteden la programmet få kontrollen tilbake etter en feilsituasjon: Der programmet normalt ville ha avsluttet med en feilmelding Eks: Divisjon med null, greier ikke åpne en fil, filen finnes ikke, knytte kontakt over nettet mislykkes, utenfor array-grensen, + + + Mål 2: Enklere, mer vedlikeholdbar og mer forståelig kode 4 4

Array indeks utenfor sine grenser int [ ] tallvektor; tallvektor = new int [100]; tallvektor[101] = 17; 5

Unntak / feil, behandling i Java Mye kode kan feile og feilaktige situasjoner (unntak) kan oppstå. Kode som kan feile kan - og som oftest må - vi legge følgende rundt: Kode som kan feile skrives her Feiler koden blir denne blokken kalt med feilobjektet e som parameter try {... Kode som kan feile...; catch (Exception e) {... Gjør noe med feilen, prøv å rett opp... finally { Blir alltid utført Må ha minst en av catch og finally 6

Fem reserverte Java ord try - Står foran en blokk som er usikker dvs. der det kan oppstå et unntak catch - Står foran en blokk som behandle et unntak. Har en peker til et unntaksobjekt som parameter finally - blir alltid utført throw - Starter å kaste et unntak lag et unntaksobjekt f.eks throw <en peker til et unntaksobjekt> throw new Unntak(); throws - Kaster et unntak videre Brukes i overskriften på en metode som ikke selv vil behandle et unntak Bruk: try { <usikker kode> catch (Unntaksklasse u) { <behandle unntaket, u peker på et objekt som beskriver unntaket> finally { rydd opp 7 7

Unntaksbehandling try { <USIKKER KODE> <Hvis det skjer noe galt:> throw new Unntaksklasse( );.... catch (Unntaksklasse unt) { < Unntaksbehandling. Dette hoppes over når intet unormalt/galt har hendt > finally { hit kommer programmet alltid, også om unntaket ikke ble fanget < her fortsetter programmet både etter normal utføring og etter behandling av eventuelle unntak, men ikke når et unntak er kastet uten at det er fanget (men da må throws med)> Enkleste form for unntaksbehandling. På forhånd har vi deklarert: class Unntaksklasse extends Exception {... 8

Når unntak oppstår i en metode og ikke behandles der A a try {.... x = b ( );.... catch (Unntaksklassen unt) { < Unntaksbehandling. Dette hoppes over når intet unormalt har hendt > finally { hit kommer programmet alltid < her fortsetter programmet både etter normal utføring og etter behandling av eventuelle unntak, men ikke hvis unntaket blir kastet videre> a kaller b int b( ) throws Unntaksklassen { b oppdager en feil: throw new Unntaksklassen ( ) ; Normal retur fra b til a: return 17; Unntaksklassen er en klasse som vi på forhånd har deklarert som en subklasse av klassen Exception. 9

Unntak som ikke behandles Uten og med opprydding int b( ) throws Unntaksklassen {........ Hvis b oppdager en feil: throw new Unntaksklassen ( ) ; Normal retur: return 17; int b( ) throws Unntaksklassen {.... try { Hvis b oppdager en feil: throw new Unntaksklassen ( ) ;.... Normal retur: return 17; finally { rydd opp før kontrollen går tilbake til kallstedet 10

Om å sende unntak tilbake til kaller (throws) Vi kan bare sende dem videre til den metoden som kalte oss: throws (og helt til kjøresystemet: > java hvis det er main som kaster unntak/feilmeldinger videre). Vi må da etter metodens parameter-parentes, men før begynnende krøll-parentes, skrive: throws UnttakType1, UnntakType2,... { hvor UnttakType1, UnntakType2,... er de typer (klassenavnene) på de unntak som oppstår (eller superklasser av disse, f.eks. Exception) og ikke selv fanger med try-catch. Merk at vi bruker ordet både for unntak metoden vår selv genererer og de unntak/feil metoden mottar (fra metoder den selv har kalt) og bare videresender. Ulempe med videre-kasting av unntak: Jo nærmere feilkilden feilen blir oppdaget og rettet, jo bedre. 11 11

Unntak - oversikt Når en feilsituasjon oppstår: Lages det et objekt Dette objektet brukes av feilbehandlingen som enten skjer i samme metode (try-catch) eller blir sendt tilbake til kallende metode (throws) Vi må ikke (men kan) behandle feil av typen: RunTimeException Artimetriske feil Array-grense-feil Behandler vi ikke slike feil, avsluttes programmet av runtime-systemet Error Grusomme systemfeil vi ikke kan gjøre noe med Feil og feil fru Blom 12

Hvilke klasser av feil og unntak har vi i Java Exception unntak (med alle subklassene) Disse unntakene kan og må vi fange (Unntatt RunTimeException) F.eks. IOException RunTimeException (en subklasse av Exception) igjen med sine subklasser som : ArrayIndexOutOfBoundsException, NumberFormatException, ArithmeticException,... Disse kan, men må vi ikke fange Vi kan, men må ikke skrive try-catch for disse feilsituasjonene Vi kan kort sagt ignorere disse (men da terminerer programmet stygt) Eks: Divisjon med 0, en peker er null, gal indeks i en array,.. Error (med alle subklassene) Noe galt skjer, vi kan som oftest ikke gjøre noe med det Eks:.InternalError.OutOfMemoryError, NoClassDefFoundError Error og Exception er subklasser av Throwable 13

Klassehierarki for unntak Throwable Vanskelig å gjøre noe med Error RuntimeException Exception IOException VirtualMachineError IOError Må fanges NullPointerException ArithmeticException Unntak i dette subtreet bør fanges 14

Unntak strategier Flere måter å behandle unntak/avbrudd: 1. Løs problemet og kall metoden som ga unntak om igjen 2. Lapper sammen ting uten å kalle metoden som ga unntak, eller beregn et alternativt ( beste ) resultat istedenfor det unntaksmetoden skulle ha beregnet 3. Avslutt programmet: System.exit(1); 4. Ignorere dem hvis de er av typen RunTimeException eller Error men hvis de oppstår terminerer programmet 15

Unntak - oversikt, forts. 5. Kaste det videre f.eks. public static void main(...) throws IOException når main kaster en feil videre er det til kjøretidsystemet og programmet terminerer 6. Ta imot / fange det og behandle det ferdig: try {... farlig kode. catch ( Exception e) {... gjør noe fornuftig og rett opp feilen finally { det som alltid må utføres 7. Ta imot, gjøre noe/litt og så kaste det (eller et annet) videre: try {... farlig kode. catch ( Exception e ) {... gjør noe fornuftig, f.eks. rett opp litt av feilen og så throw e; finally {det som alltid må utføres OGSÅ ved viderekasting 16

String-indeks utenfor stringen class Unntak0x { public static void main(string[ ] args) { new Unntak0x ( ); Unntak0x ( ) { String s = "Dette er en tekst med 29 tegn", s1; s1 = s.substring(30,32); // string-indeks utenfor "enden" 17

Behandler Stringindeks-feil class Unntak1x { public static void main(string[ ] args) { new Unntak1x ( ); Unntak1x ( ) { String s = "Dette er en tekst med 29 tegn", s1; try { s1 = s.substring(30,32); // string-indeks utenfor "enden" catch (StringIndexOutOfBoundsException e) { System.out.println("Her er det noe galt med string-indeksen ); >java Unntak1x Her er det noe galt med string-indeksen 18

Fange divisjon med 0 public class TryTest { public static void main ( String [ ] args) Her tar programmet { int i=1; seg av hele feilen for (int j=0; j < 5; j++) try{ i = 10/j; System.out.println("Det gikk OK, i:" + i + ", j:" + j); catch (Exception e) { System.out.println("Feil i uttrykk: "+ e.getmessage( )); // end TryTest snidil> java TryTest Feil i uttrykk: / by zero Det gikk OK, i:10, j:1 Det gikk OK, i:5, j:2 Det gikk OK, i:3, j:3 Det gikk OK, i:2, j:4 snidil> 19

Eksempel på bruk av unntaksobjektet class Unntak2x { public static void main(string[ ] args) { new Unntak2x ( ); Unntak2x ( ) { String s = "Dette er en tekst med 29 tegn", s1; try { s1 = s.substring(30,32); // string-indeks utenfor "enden" catch (StringIndexOutOfBoundsException e) { System.out.println("Her er det noe galt med string-indeksen " + e.getmessage( )); //end try >java Unntak2x Her er det noe galt med string-indeksen String index out of range: 32 20

Starte å sende feil/unntak selv class Feil1 { int i; public static void main(string[] args) { new Feil1().a(null); n void a(feil1 pek) { if (pek == null ) throw new NullPointerException( pek må være!= null"); pek.i = 14; Merk at her kastes et objekt av en klasse som er subklasse av RunTimeException, så da trenger vi ikke try-catch rundt kallet på metoden a 21

Flere catch pluss finally Vi kan ha flere catch etter hverandre: try {... Kode som kan gi unntak / feile... catch (Type1 t1 ) { catch (Type2 t2 ) {... catch (Type3 t3 ) {... finally { // Dette gjøres alltid - også om unntaket ikke blir behandlet // men bare kastet videre En og en catch-parameter testes: Bare den første der klassenavnet (Type1, Type2,..) er superklasse (eller samme klasse) til det innkomne unntakets klasse blir utført. Finally vil alltid bli utført enten det ble unntak eller ikke og enten noen av catchene fikk tilslag eller ikke Spesielt viktig å ha med hvis unntak blir kastet direkte videre og det er nødvendig å rydde opp 22 22

Fange flere unntak - eksempel class Unntak3x { public static void main(string[ ] args) { int dividend=7, divisor = 0; int kvotient=0; String s="dette er en tekst med 29 tegn"; String s1="*********"; try { s1 = s.substring(15,17); // OK string-indeks kvotient = dividend/divisor; // Feil: divisjon med 0 catch (StringIndexOutOfBoundsException e) { System.out.println("Her er det noe galt med string-indeksen"); catch (ArithmeticException e1) { System.out.println("Divisjon med 0: " + e1.getmessage( ) ); System.out.println(s1); System.out.println(kvotient); >java Unntak3x Divisjon med 0: / by zero st 0 23

Mer egendefinerte unntak class Mittunntak extends Exception { public Mittunntak ( ) { public Mittunntak (String s) { super(s); // end konstruktører // end class Mittunntak try{... catch (Mittunntak e) {.. e.getmessage( ).. Den nye klassen med navn Mittunntak er en subklasse av den ferdiglagete Java-klassen med navn Exception. throw new Mittunntak("feilmelding"); throw new Mittunntak( ); 24

Eksempel Konto med OvertrekkUnntak - VIKTIG class Konto { private double saldo = 0; private int kontonr; Konto (int nr) { kontonr = nr; public void taut (double belop) throws OvertrekkUnntak { if (saldo - belop < 0) { throw new OvertrekkUnntak(Integer.toString(kontonr)); else saldo = saldo - belop; public void settinn. class OvertrekkUnntak extends Exception { public OvertrekkUnntak (String s) { super(s); 25

Bruk av Konto med OvertrekkUnntak class Bank{ static void main (String [] args) { Konto pek = new Konto(234); try { pek.settinn(1000); pek.taut(500); pek.taut(5000); catch (OvertrekkUnntak e) { System.out.print(" Overtrekk på konto nummer "); System.out.println( e.getmessage()); 26