Fel och felhantering Undantag Ett program kan fungera korrekt i normalfallet men vara känsligt för störningar Felaktiga indata (från användaren/andra program) Yttre omständigheter Bra program är förberedda på att fel kan uppstå 65 66 Hur upptäcker man fel? Partiella funktioner: Funktioner som inte är definierade för vissa inputvärden Fel uppstår ofta då metoder får oväntade indata. Kontrollera indata i metoden innan något görs Kontrollera parametrarna innan metoden anropas Vad passar bäst? 67 Felhantering Vissa fel kan inte förebyggas med hjälp av if-satser En fil kan t ex raderas under skrivningen/läsningen, fast man har kollat i förväg att allt är OK Möjliga åtgärder: Avbryt eller avsluta programmet Ignorera felet och fortsätt Skriv ut ett meddelande och fortsätt Ignorera anropet som ledde till felet Tolka anropet på ett meningsfullt sätt Kräver åtgärd från användaren interaktivt Producera ett felaktigt resultat Returnera en felkod (går ej alltid)... 68 Hur bör man hantera fel? Det finns många alternativ Det finns ingen åtgärd som är bäst i alla lägen Beror på anroparens mål Låt anroparen bestämma Throw/ raise exception Kasta / flagga ett undantag Fånga exceptions int a; try { a = b / c; catch (ArithmeticException e) { a = 9999; Den anropade metoden överlåter åt anroparen att genomföra lämplig åtgärd 69 70
Undantag En exception är ett objekt som signalerar ett undantag throw-satsen kastar ett undantag som kan fångas m h a en try-sats try { catch ( ) { finally { Satser där ett undantag kan kastas Undantaget som fångas Koden där ett undantag hanteras Koden för slutåtgärder (valfri) Flera undantag kan fångas och hanteras i en try-sats (valfri) 71 Två kategorier av undantag Checked exceptions Fel som vanligtvis inte beror på fel i logiken av programmet Fel som kan uppträda under normala förhållanden Måste fångas (dvs kod som kan kasta en checked exception måste skrivas i en try-sats) eller kastas vidare med metoden, t ex IOException Unchecked exceptions Fel som brukar beror på fel i logiken av programmet Fel som kan uppträda under normala förhållanden Får ignoreras (men det är god programmeringsstil att fånga eller deklarera det), t ex ArrayIndexOutOfBoundsException 72 Mer om undantag - deklaration Exempel: public static void arraycopy ( Object source, int srcindex, Object dest, int destindex, int size) throws ArrayIndexOutOfBoundsException, ArrayStoreException Försökt spara fel sorts objekt 73 Kontrollerade undantag Ett undantag är antingen kontrollerat(checked) eller okontrollerat (unchecked) Ett kontrollerat undantag kan endast kastas i ett tryblock eller i en metod som explicit säger att den kastar detta undantag. Kompilatorn kommer att klaga om ett kontrollerat undantag inte hanteras korrekt. Ett okontrollerat undantag kräver ingen särskild hantering, men kan hanteras på samma sätt. Okontrollerade undantag är underklasser till Error eller RunTimeException. Övriga är kontrollerade. 74 Två kategorier av undantag Object Throwable Error Exception RuntimeException 75 Två kategorier av undantag Class Exception java.lang.object java.lang.throwable java.lang.exception All Implemented Interfaces: Serializable Direct Known Subclasses: AclNotFoundException, ActivationException, AlreadyBoundException, ApplicationException, AWTException, BackingStoreException, BadAttributeValueExpException, BadBinaryOpValueExpException, BadLocationException, BadStringOperationException, BrokenBarrierException, CertificateException, CloneNotSupportedException, DataFormatException, DatatypeConfigurationException, DestroyFailedException, ExecutionException, ExpandVetoException, FontFormatException, GeneralSecurityException, GSSException, IllegalClassFormatException, InterruptedException, IntrospectionException, InvalidApplicationException, InvalidMidiDataException, InvalidPreferencesFormatException, InvalidTargetObjectTypeException, IOException, JAXBException, JMException, KeySelectorException, LastOwnerException, LineUnavailableException, MarshalExceptio MidiUnavailableException, MimeTypeParseException, MimeTypeParseException, NamingException, NoninvertibleTransformException, NotBoundException, NotOwnerException, ParseException, ParserConfigurationException, PrinterException, PrintException, PrivilegedActionException, PropertyVetoException, ReflectiveOperationException, RefreshFailedException, RemarshalException, RuntimeException, SAXException, ScriptException, ServerNotActiveException, SOAPException, SQLException, TimeoutException, TooManyListenersException, TransformerException, TransformException, UnmodifiableClassException, UnsupportedAudioFileException, UnsupportedCallbackException, UnsupportedFlavorException, UnsupportedLookAndFeelException, URIReferenceException, URISyntaxException, UserException, XAException, XMLParseException, XMLSignatureException, XMLStreamException, XPathException
Två kategorier av undantag java.io Class IOException java.lang.object java.lang.throwable java.lang.exception java.io.ioexception All Implemented Interfaces: Serializable Direct Known Subclasses: ChangedCharSetException, CharacterCodingException, CharConversionException, ClosedChannelException, EOFException, FileLockInterruptionException, FileNotFoundException, FilerException, FileSystemException, HttpRetryException, IIOException, InterruptedByTimeoutException, InterruptedIOException, InvalidPropertiesFormatException, JMXProviderException, JMXServerErrorException, MalformedURLException, ObjectStreamException, ProtocolException, RemoteException, SaslException, SocketException, SSLException, SyncFailedException, UnknownHostException, UnknownServiceException, UnsupportedDataTypeException, UnsupportedEncodingException, UserPrincipalNotFoundException, UTFDataFormatException, ZipException Två kategorier av undantag java.lang Class RuntimeException java.lang.object java.lang.throwable java.lang.exception java.lang.runtimeexception All Implemented Interfaces: Serializable Direct Known Subclasses: AnnotationTypeMismatchException, ArithmeticException, ArrayStoreException, BufferOverflowExceptio BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DataBindingException, DOMException, EmptyStackException, EnumConstantNotPresentException, EventException, FileSystemAlreadyExistsException, FileSystemNotFoundException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, IllformedLocaleExceptio ImagingOpException, IncompleteAnnotationException, IndexOutOfBoundsException, JMRuntimeException, LSException, MalformedParameterizedTypeException, MirroredTypesException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NoSuchMechanismException, NullPointerException, ProfileDataException, ProviderException, ProviderNotFoundException, RasterFormatException, RejectedExecutionException, SecurityException, SystemException, TypeConstraintException, TypeNotPresentException, UndeclaredThrowableExceptio UnknownEntityException, UnmodifiableSetException, UnsupportedOperationException, WebServiceException, WrongMethodTypeException Egna undantag package Body; Egna undantag Man kan definiera egna undantag genom att ärva från någon av undantagsklasserna Exceptions kastas med hjälp av throwsatsen Throw-satsen finns i normala fall i en if-sats som kollar ifall undantaget skall kastas. public class SateliteException extends Exception{ public SateliteException() { super(); // TODO Auto-generated constructor stub public SateliteException(String message) { super(message); // TODO Auto-generated constructor stub public SateliteException(String message, Throwable cause) { super(message, cause); // TODO Auto-generated constructor stub public SateliteException(Throwable cause) { super(cause); // TODO Auto-generated constructor stub 79 80 Egna undantag public Planet getmotherplanet() throws SateliteException { logger.info("getmotherplanet: "+motherplanet); if (motherplanet == null) { throw new SateliteException("try to access motherplanet before it is initialized"); return motherplanet; public void setmotherplanet(planet motherplanet) throws SateliteException { logger.info("setmotherplanet: "+motherplanet); if (motherplanet == null) { throw new SateliteException("motherPlanet is null",new NullPointerException()); Analys och design this.motherplanet = motherplanet; public static void main(string[] args) throws SateliteException { Satelite sat = new Satelite(1,1,1), sat2 = new Satelite(); sat.setmotherplanet(planet.jupiter); med hjälp av CRC try { sat.setmotherplanet(planet.jupiter); catch (SateliteException e) { // TODO Auto-generated catch block e.printstacktrace(); System.out.println("Mother planet? "+sat2.getmotherplanet()); 81 82
Objekt Ett objekt är en individuellt identifierbar entitet som kan vara konkret eller abstrakt. Ett objekt har tillstånd, beteende och identitet. Reellt, gripbart, synligt ting (t ex en specifik person) Abstrakt ting (t ex en tid eller en anställd) Varje objekt har ett tillstånd, ett beteende och en identitet. Tillståndet beskriver objektets egenskaper (t ex adress och ålder hos en person) Beteendet beskriver vad objektet kan göra (t ex flytta). OBS! Detta kan innebära att tillståndet ändras Identiteten skiljer ett objekt från alla andra objekt 83 Klass En klass är en byggplan för objekt av samma sort. Alla objekt av en klass (instanser) har samma sorts egenskaper och beteenden En klass beskriver en mängd liknande objekt Datatyp namn ålder adress flytta... Person Namn på klassen egenskaper (attribut) beteende (metoder) 84 Klassdiagram Klassdiagram Länk till mer om UML och dess pilar http://www.ibm.com/developerworks/rational/library/content/rationaledge/sep04/bell/ UML: Klassrelationer Klassdiagram svag koppling stark koppling 87
Problemlösning Alla större projekt misslyckas, eftersom det är omöjligt för utvecklarna att till fullo förstå uppgiften som ska lösas och vilka alla problem som är inneboende i uppgiften. Antaganden måste klargöras Möjliga feltolkningar måste undanröjas När problem/uppgifterna blir större, måste lösningen delas in i hanterliga delar Denna teknik är fundamental för programvaruutveckling I objektorienterad utveckling delas lösningen in i objekt och klasser 89 Programutveckling sker i faser Här: starkt förenklat version Passar bara mindre projekt Fem delmoment: Fastställa och analysera förutsättningarna/kraven Skapa en design Implementera koden Testning Dokumentation OBS! Testning och dokumentation ska ske parallellt med de övriga momenten. 90 OOA&D Design Kräver förståelse för uppgiften/problemet Analys Kräver språk för att uttrycka designen i Kräver ett strukturerat arbetssätt Bygger på erfarenhet Syftar till att få fram en OO modell som går att implementera Design och analys hör ihop 91 OOA&D Modeller underlättar kommunikation Oberoende av programspråk Abstraherar från oväsentliga detaljer Underlättar testning i tidigt skede Några bra verktyg CRC-kort UML (ett modelleringsspråk) Designmönster (Fabrik,...) Interaktionen/flödet Scenarios Swim-lanes Skisser Mock-up:er 92 Fastställa och analysera förutsättningarna/ kraven Vad ska göras? Vilka begränsningar finns? Är alla oklarheter utredda? Gör modeller/utkast Undvik att tänka på implementationen 93 Skapa en OO-design Bestäm klasser, objekt och metoder som behövs Vad finns redan? Bestäm algoritmer för problemlösningen I princip oberoende av programmeringsspråk Diagram Pseudokod Designa för återanvändning? Det är svårare att göra generella lösningar Kan löna sig i framtiden Återanvändning har varit en stor anledning till OOboomen 94
OOA&D med CRC-kort Analys Förstå problemet/uppgiften Utveckla en OO modell av problemet Design Utveckla en OO modell av lösningen Modeller underlättar kommunikation Oberoende av programspråk Abstraherar från oväsentliga detaljer Underlättar testning i tidigt skede CRC-kort UML(ett modelleringsspråk för OO utveckling) Rollspelsdiagram 95 CRC Metoden Grupparbete(4-6 personer) Hitta kandidatobjekt Brainstorming Substantiv & adjektiv Filtrera kandidatobjekten Skapa CRC-kort för kvarvarande kandidatobjekt Definiera scener för testning av modellen (testfall) Spela in scener m.h.a rollspelsdiagram (testa) Uppdatera CRC-korten och scenerna 96 Brainstorming Fokuserat utforskande i grupp Okritiskt förhållningssätt i genereringsfasen Kräver bra förståelse och analys Substantiv & adjektiv i uppdragsbeskrivning Lätt metod Kräver en vettig och inte allt för ordig och lång beskrivning Filtrering Oavsett metod så måste man göra en bearbetning av kandidaterna Så att god klass-design uppnås CRC-kort Class-Responsibilities-Collaborators Klass-ansvar-sammarbetspartner Ett CRC-kort motsvarar en klassbeskrivning Liknande kandidater slås ihop Skippa kandidater som: Inte går att benämna med ett substantiv eller adjektiv Beskriver imp. detaljer, egenskaper, utan direkt ansvar, modellerar GUI, systemklasser, utanför Informellt verktyg för att ta fram och utvärdera olika ramarna, alternativ 99 100
Scenarier RPD - skapa scenarior för att testa designen Exempel på hur systemet används Hur gör man för att ta fram scenarier? Brainstorming, Vilka använder systemet, hur använder man systemet, vilka kommer i kontakt med systemet, Så heltäckande det går Kräver en gedigen förståelse och analys av uppgiften Börja med några väldigt enkla 101 RPD spela rollspelet RPD -spela in rollspelet 104 Uppdatera CRC-korten Efter några scenarion & iterationer När CRC-korten är någorlunda stabila kan de göras om till mera formella klassdiagram Design 105 106
Byggritningen (utan GUI)