Exceptions = exceptional event

Relevanta dokument
Fel och felhantering. Undantag

Att skriva till och läsa från terminalfönstret

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Föreläsning 5. Gränsnittet Comparable. Gränssnittet Comparator. Undantag

Föreläsning 8. Undantag Gränsnittet Comparator Gränssnittet Comparable Designmönstert Strategy

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Föreläsning 1, vecka 8: Att förbereda sig för tentan

OOP Objekt-orienterad programmering

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Testning av program. Verklig modell för programutveckling

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Föreläsnings 9 - Exceptions, I/O

Klassen javax.swing.timer

Felhantering TDDD78, TDDE30, 729A

Föreläsning 14. Filhantering

F10 - Exceptions. ID1004 Objektorienterad programmering Fredrik Kilander

Recitation 4. 2-D arrays. Exceptions

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

Exceptions (undantag) Murach s: kap 7

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Objektorienterad Programmering (TDDC77)

Repetition av OOP- och Javabegrepp

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Felhantering. Andra brott mot språkets regler. Man kan också i programmet bryta mot ett antal olika regler som gäller. Exempelvis:

Repetition av OOP- och Javabegrepp

Testning och felhantering

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Objektorienterad programmering

Språkkonventioner och redigering av tal.

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

Objektorienterad Programmering DAT043. Föreläsning 4 23/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Fördjupad Java. Undantagshantering. Fel

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Felsökning, UML. Översikt. Java starkt typat. Typomvandling (casting) Exempelhierarki. Stark typning

Outline. Objektorienterad Programmering (TDDC77) Lösningen heter Collection. Collection gränsnittet. Collection. Iterable. Ahmed Rezine.

OOP Objekt-orienterad programmering

1 Comparator & Comparable

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

F3: Recursive descent, tokenisering, avbildningar och undantag. Carl Nettelblad

Objektorienterad Programmering (TDDC77)

F4. programmeringsteknik och Matlab

Lösningsförslag FYTA11 Javaprogrammering

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Input. Programmering. Andra källor

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningar för tenta 2 DAT043,

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

PROGRAMMERING-Java Omtentamina

Föreläsning 8: Exempel och problemlösning

Tentamen FYTA11 Javaprogrammering

Objektorienterad programmering

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Föreläsning 3 Innehåll

Diskutera Sortera objekt

Föreläsning 3. Stack

Objektorienterad programmering D2

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Länkade strukturer, parametriserade typer och undantag

TDDC77 Objektorienterad Programmering

Felsökning. Översikt. Felsökning (debugging) Kodstandard. Kommentarer. Kommentarer. Praktiska råd

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Kap J 7-1 Mer om arv. (superklass) (subklass)

DAT043 Objektorienterad Programmering

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Parallellism, återblick

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Programmering för språkteknologer II, HT2014. Rum

JAVAUTVECKLING LEKTION 4

List.java. List.java. Printed by Tom Smedsaas

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Detta dokument är ett exempel, cirka hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Lösningsförslag till tentamen FYTA11 Javaprogrammering

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

Tentamen OOP

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Föreläsning 3. Stack

JAVAUTVECKLING LEKTION 7

Transkript:

itop F 13 Läsanvisning: kap 15 fram tom s 655 Del 1 Exceptions! Varför exceptions, Syntax och semantik! Klassen Trowable och exceptions hierarkin! Hur skall man hantera en exception?! Var skall man hantera en exception?! När man (inte) skall använda exceptions Del 2 Stoff bra att ha Läsanvisning: Dessa OH samt samt APIn Nästa gång: tentalära och gammal tenta Exceptions = exceptional event! namngivna signaler eller programskydd vid runtime Program skall aldrig behöva krascha Javas exceptions används för att ta hand om sådana situationer som normalt inte skall inträffa och som är krävande att testa på. Exempel på fel som kan vara lämpliga att hantera med exceptions: - öppnande av fil som inte existerar - indexering utanför gränserna i ett fält - division med noll - försök att läsa/skriva mot en enhet som inte fungerar - Vissa inmatningsfel, tex en bokstav i stället för en siffra - minnet tar slut Tänk på: Exceptions är dyrbart jämfört med vanlig kod. F13 Exceptions och bra att ha saker 1 F13 Exceptions och bra att ha saker 2 Exceptions - Syntax satser som kan kasta en exception direkt efter try: catch (Exception1 name) { satser för att (fånga och) hantera den exceptionella händelsen av klassen Exception1 eller subklasser till denna klass catch (Exception2 name) { satser för att Exception2 catch finally { satser som alltid utförs oavsett om ett fel inträffade eller ej vanligen för att städa upp tex stänga filer Semantik När ett fel inträffar skapas ett objekt som innehåller! felets typ,! ett felmeddelande! och information om systemets status när felet uppstod. (en trace ) Detta objekt lämnas till runtime-systemet som försöker hitta en felhanterare (dvs ett catchblock) genom att! först söka i metoden där felet uppstod,! sedan i metoden som kallade på metoden där felet uppstod, sedan osv! tills man når huvudprogrammet main. Om ingen felhanterare för felet hittas avslutas programmet och felet och en trace skrivs ut på standard.err (vanligen skärmen). Kontrollen kan inte återgå till det ställe där felet uppstod utan ett fel innebär alltid att blocket etc. avslutas. Hanterare i tex funktioner måste därför ha en return sats. F13 Exceptions och bra att ha saker 3 F13 Exceptions och bra att ha saker 4

Varför exceptions?! separerar felhantering från vanlig kod Man programmerar först som om felen inte inträffade, sen tar man hand om felen.! enkel (men dyrbar) felpropagering (tack vare propagering till närmsta felhanterare)! gruppering av feltyper (fel är objekt som tillhör klasser ) Exeptions kan vara! fördefinierade: finns i Javas API! egendefinierade: du får skriva själv! checked : måste hanteras! unchecked : kan ignoreras F13 Exceptions och bra att ha saker 5 Gruppering av feltyper En exceptionell händelse beskrivs med hjälp av ett objekt som tillhör någon subklass till standardklassen Throwable. Det finns två standardiserade subklasser till Throwable klasserna Exception och Error. Klassen Error används av Javainterpretatorn för att signalera allvarliga interna systemfel t. ex. länkningsfel och att minnet tagit slut. Vanligtvis finns inte mycket att göra åt denna typ av fel. Vi kommer inte att behandla denna typ av fel. De fel som hanteras i "vanliga" program tillhör subklasser till Exception. Denna typ av fel orsakas av själva programmet och vid interaktionen med programmet. Sådana fel kan fångas och hanteras i programmet. F13 Exceptions och bra att ha saker 6 Subklasser till klassen Exception AclNotFoundException, ActivationException, AlreadyBoundException, ApplicationException, AWTException BadLocationException, ClassNotFoundException, CloneNotSupportedException, DataFormatException, ExpandVetoException, FontFormatException, GeneralSecurityException, IllegalAccessException InstantiationException, InterruptedException, IntrospectionException, InvalidMidiDataException, InvocationTargetException, IOException, LastOwnerException, LineUnavailableException, MidiUnavailableException, MimeTypeParseException, NamingException, NoninvertibleTransformException, NoSuchFieldException, NoSuchMethodException, NotBoundException, NotOwnerException, ParseException, PrinterException, PrivilegedActionException, PropertyVetoException, RemarshalException, RuntimeException, ServerNotActiveException, SQLException, TooManyListenersException, UnsupportedAudioFileException, UnsupportedFlavorException, UnsupportedLookAndFeelException, UserException Subklasser till klassen RuntimeException ArithmeticException, ArrayStoreException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnsupportedOperationException Subklasser till klassen IndexOutOfBoundsException ArrayIndexOutOfBoundsException, StringIndexOutOfBoundsException Exeptions i klassen RuntimeExceptions behöver inte fångas och inte hanteras om man inte vill (unchecked) F13 Exceptions och bra att ha saker 7 F13 Exceptions och bra att ha saker 8

I APIn kan det se ut så här: java.lang.object +--java.lang.throwable +--java.lang.exception +--java.lang.runtimeexception +--java.lang.illegalargumentexception +--java.lang.numberformatexception Ett catch - block fångar alla exceptions som är av specificerad klass och subklasser till denna klass. Ordningen av catch- blocken är således av betydelse. Fångar man en Throwable eller en Exception så fångar man allt och det är vanligtvis inte ok, man skall vara mer specifik. F13 Exceptions och bra att ha saker 9 Man kan kasta själv I vår cirkelklass har vi en setradius och radien kan inte vara <0: /** Set a new radius */ public void setradius( double newradius) throws IllegalArgumentException { if (newradius >= 0) radius = newradius; else throw new IllegalArgumentException( "Radius cannot be negative"); Vi måste inte deklarera att vi kastar en IllegalArgumentException eftersom den är en unchecked exception 10 Andra som kastar exceptions Många metoder i de fördefinierade klasserna kastar en exception. Tex så kastar parseint en NumberFormatException om strängen som skall konverteras inte består av siffror. Från APIn: --------------------------- public static int parseint(string s) throws NumberFormatException Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign '-' ('\u002d') to indicate a negative value. Throws: NumberFormatException - if the string does not contain a parsable integer. ----------------------------------- Man kan naturligtvis gå igenom strängen och kontrollera detta innan man anropar parseint men det är rätt omständligt så här fångar man det kastade felet. HUR skall felet hanteras? I varje situation måste man tänka på vilket typ av felåtgärd som behövs för just den situationen. Ofta är det en kombination av åtgärder. Exempel:! Ta inte hand om felet alls här (vanligt!)! Kasta vidare med bättre felutskrift! Kasta vidare som annan exception! Felutskrift+avsluta! Ta hand om felet och vidtag åtgärd ( error recovery ) så programmet kan fortsätta som om inget hänt. (måste göras på rätt ställe)! Städa, tex stänga filer, gör felutskrift och avsluta programmet.! F13 Exceptions och bra att ha saker 11 F13 Exceptions och bra att ha saker 12

Några sätt att hantera fel 1 Negligera Om vi inte vill/kan ta hand om felet så kan vi negligera det. Bra i så fall om vi nämner att vi eventuellt kastar det. Negligera: public static int getint() throws // ev annan kod int i = 0; NumberFormatException { 2 Kasta vidare public static int getint() { // ev annan kod int i = 0; catch(numberformatexception e ) { throw new NumberFormatException ( getint: Min egen felutskrift som ofta inleds med metoden i vilken den inträffade ); // eller byte av fel String str = <lämplig text> throw new IllegalArgumentException(str); // end catch F13 Exceptions och bra att ha saker 13 F13 Exceptions och bra att ha saker 14 3 Felutskrifter och avsluta public static int getint() { // ev annan kod int i = 0; catch(numberformatexception e ) { System.out.println("Read failed!"); e.printstacktrace(); System.exit(1); // end catch 4Ta hand om felet och vidtag åtgärd public static int getint() { int i = 0; // + ev. annan kod här boolean notready = true; while(notready) { notready = false; catch(numberformatexception e ) { System.out.println("Read failed!"); System.out.print(" Ge talet på nytt: "); // System.out.flush(); catch ( AnotherException e ) { Vad kan man göra? * se nästa OH // end catch // end while // obs att try-catch är inuti en while F13 Exceptions och bra att ha saker 15 F13 Exceptions och bra att ha saker 16

Användbara metoder Ur objektet som skapas (e ovan) kan man få en del information: String tostring() Returns a short description of this throwable. void printstacktrace() Prints this throwable and its backtrace to the standard error stream. String getmessage() Returns the detail message string of this throwable. * Några alternativ för catch blocket: - System.out.println(<.>); - e.printstacktrace(); - System.out.println(e.getMessage()); - throw e; - throw new <Exnamn>( <felmedd.> ); - System.exit(1); exit ofta i kombination med de andra F13 Exceptions och bra att ha saker 17 VAR skall felet hanteras? // Construct a circle with a specified radius public Circle( double newradius ) { setradius(newradius); numberofobjects++; catch (IllegalArgumentException ex) { ex.printstacktrace(); // inte bra lösning Är detta bra? 1) här kan vi ju inte göra något åt händelsen annat än att skriva ut en felutskrift. 2) Dessutom fortsätter sedan programmet som om allt gick bra. Gjorde det det? Man skall ta hand om felhändelserna där man kan göra vettiga åtgärder. Vanligtvis är det INTE där felet uppstår utan hos någon som anropade metoden där felet uppstod eller längre upp i anropskedjan. F13 Exceptions och bra att ha saker 18 När skall man använda exceptions Exempel - ArrayIndexOutOfBounds Exceptions lämpar sig väl för händelser! som normalt inte skall inträffa och! som är omständliga att testa på. a[x][y] = a[k][l] + 3; Här blir det väldigt omständligt att testa alla indexgränser varje gång man skall använda fältet så här funkar exceptions bättre än egen testning, speciell som det sköts av runtime systemet. if ( x >= 0 && x < a.length && y >= 0 && y < a[x].length && k >= 0 && k < a.length && l >= 0 && l < a[k].length ) { a[x][y] = a[k][l] + 3; När skall man (inte) använda exceptions String str =.nextline(); if( str.equals("ja") ) { ; else { ; Om vi vid inläsning av strängen str ger end of file (ctrl D eller ctrl- Z) uppstår ett fel vid anropet av str.equals("ja"). En exception erhålls av typen java.lang.nullpointerexception Men här är det lätt att ändra koden String str =.readline(); if ( str!= null && str.equals("ja") ) { ; else { ; Detta handlar om inmatning och då kan man oftast ta ansvar för att det som matas in är riktigt, vanligen utan exceptions. F13 Exceptions och bra att ha saker 19 F13 Exceptions och bra att ha saker 20

När skall man (inte) använda exceptions int tal1 = getint(); int tal2 = getint(); int res = tal1 / tal2; Om vi vid inläsning av tal2 ger heltalet 0 uppstår ett fel vid beräkningen av uttrycket tal1 / tal2, eftersom vi då har en division med 0. En exception erhålls av typen java.lang.arithmeticexception Eftersom detta är inläsning från en användare kan detta normalt lösas med extra kod int tal1 =..readint(); int tal2 =..readint(); if( tal2!= 0 ) { int res = tal1 / tal2; else {. ja vad gör man här då? Men division med noll kan ju uppstå även utan användarens inblandning double x = Math.sin(<ett uttryck>); y = 1/x; // =Infinity ingen exception reses med double! Egna exceptions - enkelt ex. public static void zero() { int numer; int denom; System.out.print("numerator: "); numer = MyIn.nextInt(); System.out.print("denominator: "); denom = MyIn.nextInt(); if ( denom == 0 ) {??????? vad göra else { println = numer/(double)denom; // end zero4 Man kan skapa en egen exception: public class DivideByZero extends Exception { public DivideByZero() { super("dividing by Zero!"); public DivideByZero( String message) { super(message); F13 Exceptions och bra att ha saker 21 F13 Exceptions och bra att ha saker 22 public static void zero4() throws DivideByZero{ int numer; int denom; double quotient; System.out.print("numerator: "); numer = MyIn.nextInt(); System.out.print("denominator: "); denom = MyIn.nextInt(); if ( denom == 0 ) { throw new DivideByZero ("zero4: + cannot do division + by zero."); else { quotient = numer/(double)denom; System.out.println(quotient); // end zero4 Nu får anroparen ta hand om felet ps void callzero4( ){ Sout.println("calling zero4: "); zero4();. catch ( DivideByZero e ) { System.out.println( e.getmessage()); e.printstacktrace(); system.exit(1); % javac zero4: numerator: 1 denominator: 0 zero4: I cannot do division by zero. Zero$DivideByZero: zero4: I cannot do division by zero. at Zero.zero4(Zero.java:97) at Zero.main(Zero.java:112) F13 Exceptions och bra att ha saker 23 F13 Exceptions och bra att ha saker 24