Översikt Felsökning, UML Typomvandling Felsökning Unified Modeling Language (UML) Abstrakta klasser, interface Multipel ärvning Programmering tillämpningar och datastrukturer 2 Java starkt typat Variabler kan inte förändra sin typ under körning Typomvandling (casting) Automatisk typomvandling (ökad noggr) int i = 3; double d = i; Åt andra hållet: manuell typomvandling double d = 4.8; int i = (int) d; // explicit casting (i = 4) Programmering tillämpningar och datastrukturer 3 Programmering tillämpningar och datastrukturer 4 Exempelhierarki Stark typning Object Object Fågel Fågel Kompilatorn kollar alltid om ett uttryck (eller anrop) är kompatibel med variabelns typ En variabel kan dock under körning komma att referera till subklass Fågel fågel = new Pingvin(); // fungerar bra: automatisk upcast Rovfågel Rovfågel Duva Duva Pingvin pingvin = fågel; // får kompilatorfel Pingvin Pingvin Falk Falk Kompilerar inte trots att fågel faktiskt refererar till ett objekt av typen Pingvin Programmering tillämpningar och datastrukturer 5 Programmering tillämpningar och datastrukturer 6
Typomvandling (casting) Typomvandling (downcast) Fågel[] minafåglar = new Fågel[5]; minafåglar[0] = new Pingvin(); minafåglar[1] = new Pingvin(); for (i = 0; i<minafåglar.size(); i++) { minafåglar[i].putsafracken(); // initiering Vi måste explicit typomvandla så att kompilatorn ser att typen är rätt vid anropet Kompilatorfel! Inte definierad för Fågel Programmering tillämpningar och datastrukturer 7 Programmering tillämpningar och datastrukturer 8 Typomvandling (casting) Typomvandling (casting) Fågel[] minafåglar = new Fågel[5]; minafåglar[0] = new Pingvin(); // initiering minafåglar[1] = new Pingvin(); for (i = 0; i<minafåglar.size(); i++) { Pingvin p = minafåglar[i]; p.putsafracken(); Nu är kompilatorn nöjd Kan ge körfel om vi råkar omvandla Fågel till Pingvin! Programmering tillämpningar och datastrukturer 9 Fågel[] minafåglar = new Fågel[5]; minafåglar[0] = new Fågel(); // initiering minafåglar[1] = new Pingvin(); for (i = 0; i<minafåglar.size(); i++) { if minafåglar[i] instanceof Pingvin { Pingvin p = (Pingvin) minafåglar[i]; p.putsafracken(); Programmering tillämpningar och datastrukturer 10 Bra stöd för felsökning i Eclipse Felsökning och debuggning Debug perspective Variables Show logical structure Tasks-fliken Expressions Watch Brakepoints TODO-stöd Programmering tillämpningar och datastrukturer 12
Programfel Exempel på logiskt fel Syntaktiska fel Upptäcks av kompilatorn Fel under körning (exceptions) Upptäcks när programmet kraschar Logiska fel Upptäcks kanske aldrig! Leder kanske inte till krasch, utan till konstigt beteende Ex. avslutar loop efter ett varv Programmering tillämpningar och datastrukturer 13 public boolean containselement(el el, MyList lista) { int i = 0; while (i<lista.size()) { if (lista.get(i)==el) { return true; else { i = i + 1; return false; Programmering tillämpningar och datastrukturer 14 Exempel på logiskt fel public boolean containselement(el el, MyList lista) { int i = 0; while (i<lista.size()) { if (lista.get(i)==el) { return true; else { i = i + 1; return false; Programmering tillämpningar och datastrukturer 15 Undantag (exceptions) Bearbetningen stoppas Fel under körning JVM skapar ett exception-objekt Info om typ av fel Sträng-meddelande Var felet uppstod Kedjan av anrop som ledde hit (stack trace) Variabelbindningar i det ögonblick felet uppstod Exeptions Exceptions genereras genom throw else { throw new NoSuchElementException(); Programmering tillämpningar och datastrukturer 17 Programmering tillämpningar och datastrukturer 18
Typer av exceptions Checked (utanför din kontroll) Beror på yttre omständigheter File not found Unexpected end of file (EOF) IO (t.ex. fel vid inmatning) Unchecked (ofta självförvållat) Mildare programmeringsfel Index out of bounds Totalkrasch Out of memory Exceptions Checked (tom fil, IO-fel, inmatningsfel) Måste hanteras av programmeraren Unchecked (null pointer, index out of bounds) Behöver inte hanteras Unchecked (out of memory) Bör inte hanteras! Ytterligare körning av programmet kan förvärra läget Programmering tillämpningar och datastrukturer 19 Programmering tillämpningar och datastrukturer 20 Hantering av exceptions Try catch try { // fråga efter och läs in ålder från inputfönster catch(ioexception ex) { System.err.println( Inmatningsfel: + ex); ex.printstacktrace(system.out); ålder = DEFAULT_ÅLDER; Multipla catch try { // fråga efter och läs in filnamn catch(filenotfoundexception ex) { catch(ioexception ex) { Programmering tillämpningar och datastrukturer 21 Programmering tillämpningar och datastrukturer 22 Exceptions-hierarkin Mer om catch Error Throwable Exception Hierarki av catch-klausuler i anropskedjan AssertionError VirtualMachineError OutOfMemoryError RunTimeException IOException ArithmeticException EOFException IllegalArgumentException FileNotfoundException NumberFormatException IndexOutOfBoundsException Ska helst fånga upp felet där orsaken finns Störst chans att kunna åtgärda problemet där det uppstod Ex. anrop av metod med argument utanför tillåtet intervall Bäst att hantera fel hos anroparen ArrayIndexOutOfBoundsException NullPointerException Programmering tillämpningar och datastrukturer 23 Programmering tillämpningar och datastrukturer 24
Throws Throw Kanske felet orsakades högre upp i anropshierarkin? Throws: sätt att låta någon annan (t.ex anroparen till anroparen) hantera en exception public void initieradata() { try { ;.läsdata(); catch (EOFxception ex) { ex.printstacktrace(); catch (IOException ex) { System.err.println(... ); public void läsdata throws IOException, EOFException { Programmering tillämpningar och datastrukturer 25 public void lägginnamn(string namn) { if (!rättformat(namn)) { throw new IllegalArgumentException(<meddelande>); // annars fortsätt exekvera Ett eget undantag genereras Programmering tillämpningar och datastrukturer 26 UML Unified Modeling Language (UML) 12 olika diagramtyper, bl.a. Klassdiagram Sekvensdiagram Anropsflödet Användningsfall Programmering tillämpningar och datastrukturer 28 Relationer mellan klasser Är en (arv, inheritance) Känner till (association) Är ett aggregat av (aggregation) Noder i en lista Namn i en e-telefonkatalog Är en sammansättning av (composition) Obligatoriska delar Flygplan måste ha vingar Har inre (nästlad) klass (enclosure) Relationer M:M (1.. 1../0../) Många till många Ex. Ipod - låtar 1:M (1 1../0../) Ett till många Ex. ränta - konton 1:1 (1 1) Ett till ett Ex. student personnummer Programmering tillämpningar och datastrukturer 29 Programmering tillämpningar och datastrukturer 30
Association Association A innehåller referens till ett objekt av typ B a. Kan vara variabel deklarerad i A b. Kan vara parameter i en metod hos A I UML: Om fall a. kan rollen ex.vis. sättas till variabelnamnet Programmering tillämpningar och datastrukturer 31 Programmering tillämpningar och datastrukturer 32 Association (via variabel) public class BankKonto { private static double räntesats; private double saldo; private Kund kontoinnehavare; public double skickasaldobesked() { skrivtill(kontoinnehavare, saldo); Objekt av den här typen har koll på/tillgång till objekt av den här typen Association (via parameter) public class BankKonto { private static double räntesats; private double saldo; Objekt av den här typen har koll på objekt av den här typen public double skickasaldobesked(kund kontoinnehavare) { skrivtill(kontoinnehavare, saldo); Programmering tillämpningar och datastrukturer 33 Programmering tillämpningar och datastrukturer 34 A är ett aggregerat av B:n Lös sammansättning Ofta i form av lista, array, etc. Delarna kommer och går, och samma del kan tillhöra flera helheter Ex. noder Ex. färger (color) Delarna kan existera självständigt utan aggregatet Ofta många till många relation Kontor aggregat av Enheter public class Kontor { // Olika avdelningar på kontoret Enhet[] avdelningar = { new Enhet( fakturor"), new Enhet( order"), ; public Kontor() { // konstruktor Programmering tillämpningar och datastrukturer 35 Programmering tillämpningar och datastrukturer 36
Kontor aggregat av Enheter Består av (sammansättning av) Delarna lever och dör med helheten, dvs. meningslöst att ha delarna när helheten är borta Ex. flygplansvingar Delen kan endast tillhöra en helhet Ex. punkt tillhör en geometrisk form Programmering tillämpningar och datastrukturer 37 Programmering tillämpningar och datastrukturer 38 Dator består av minne, Dator består av minne public class Dator { Minne minne; CPU cpu; public Dator() { // konstuktor Programmering tillämpningar och datastrukturer 39 Programmering tillämpningar och datastrukturer 40 Nästlade klasser (klass i klass) Nästlade klasser public class MyList { private MyNode first; private MyNode last; private int size; private class MyNode { private MyNode previous; private MyNode next; private Object contents; Programmering tillämpningar och datastrukturer 41 Programmering tillämpningar och datastrukturer 42
Sekvensdiagram Sekvensdiagram Visar informationsflöde i pgm:et Vertikal tidsaxel Fokus på följd av händelser Inte exakt timing (men det går också) Visar hur objekt skapas Korta vertikala aktiveringslinjer för olika objekt (fet linje längs tidslinjen) Visar hur länge objektet är aktivt Bearbetar ett meddelande just då Meddelande skickas Svar returneras Programmering tillämpningar och datastrukturer 43 Programmering tillämpningar och datastrukturer 44 Exempel: Djur Sekvensdiagram Djur public static void main(string[] args) { Djur[] alladjur = new Djur[2]; int i; TestaDjur new alladjur kurre vilma new alladjur[0] = new Katt("Kurre"); alladjur[1] = new Hund("Vilma"); new i = 0; while(i < alladjur.length) { alladjur[i].presenteradig(); i = i + 1; tid Message1 presenteradig presenteradig Programmering tillämpningar och datastrukturer 45 Programmering tillämpningar och datastrukturer 46 Användningsfall (use cases) Användningsfall (use cases) Visar hur användare och yttre entiteter (ex.vis. andra system) interagerar med programmet Sätta övre gräns Uppdatera in/ut-balans Används vid analys av användarkrav Utgångspunkt för senare systemtest Test att systemkomponenterna fungerar tillsammans Test att systemet fungerar tillsammans med andra system som kunden kör Huvudansvarig chef Börsmäklare Analysera risk «uses» «uses» Sätta pris Få igenom affär Revisor Värdera Säljare Programmering tillämpningar och datastrukturer 47 Programmering tillämpningar och datastrukturer 48
Paket Visar beroenden mellan paket java.util Abstrakta klasser, interfacer MyList MyLib Programmering tillämpningar och datastrukturer 49 Abstrakta klasser presenteradig() Innehåller en del odefinierade (dvs. abstrakta metoder) Kan inte instansieras P.g.a. att kod fattas Kan dock ärvas av andra klasser Programmering tillämpningar och datastrukturer 51 public static void main(string[] args) { Djur[] alladjur = new Djur[3]; int i; alladjur[0] = new Hund( Laban"); alladjur[1] = new Katt( Kurre"); alladjur[2] = new Katt( Morris"); i = 0; while(i < alladjur.length) { alladjur[i].presenteradig(); i = i + 1; Anropas aldrig för Djur, men måste finnas i Djur (annars kompilatorfel) Programmering tillämpningar och datastrukturer 52 Abstrakta klasser Vill inte definiera när jag vet att koden aldrig kommer att utföras Det är de specifika djurarterna (subklasserna) som vet bäst hur de ska presentera sig, så låt definitionen ligga endast i subklasserna men, måste finnas för att möjliggöra generellt anrop Djur som abstrakt klass public abstract class Djur { private String namn; private int födelseår; private static int ålder; private static int nuvarandeår = 2005; public Djur(String namn, int ålder) { this.namn = namn; Djur.ålder = ålder; //födelseår = nuvarandeår - ålder; public abstract void presenteradig(); // defineras inte Programmering tillämpningar och datastrukturer 53 Programmering tillämpningar och datastrukturer 54
Interface Interface Alla metoder är abstrakta Finns inga definitioner i klassen Kan inte instansieras Kan inte heller ärvas Finns ingen kod att ärva Kan implementeras av andra klasser All metoder måste implementeras av klassen Kontrakt om implementeringen av ett visst protokoll Ex.vis. mellan Java:s skapare och APIprogrammerare Mellan programmeringsteam som är ansvariga för olika delar av ett system public MyList List implements List{ Programmering tillämpningar och datastrukturer 55 Programmering tillämpningar och datastrukturer 56 Interface Adapters Specificerar signatur hos ett antal metoder Signatur = namn + parametrar Explicit krav på att den klass som implementerar interfacet inkluderar alla specifierade metoder Annars får man kompilatorfel Abstrakt klass som ger grundläggande implementation av interfacet Programmeraren behöver bara överskugga enstaka metoder Resten kan ärvas från adaptern Programmering tillämpningar och datastrukturer 57 Programmering tillämpningar och datastrukturer 58 Inget multipelt arv i Java Multipelt arv? Om en klass hade ärvt från flera superklasser Problem Antag att samma variabel eller instansmetod i både klasserna Ex. klasserna Pingvin och Falk har var sitt namn, varsitt sätt att ta sig fram Vilken av dessa ska ärvas av gemensam subklass? Programmering tillämpningar och datastrukturer 60
Java Hade velat ha Tillåter inte multipel ärvning Men, finns sätt att implementera detta m.h.a. interfaces Klasser kan implementera multipla interfaces Löser samtidigt problemet med vilka variabler och metoder som ska ärvas Du anger själv vilka Programmering tillämpningar och datastrukturer 61 Programmering tillämpningar och datastrukturer 62 Multipel ärvning via interface Måste kod skrivas två gånger? StudentInterface LärareInterface StudentInterface LärareInterface Student Kursass Lärare Student Kursass Lärare Programmering tillämpningar och datastrukturer 63 Programmering tillämpningar och datastrukturer 64 public class Kursass { Student student; Lärare lärare; public Kursass(String namn, int arbetstimmar) { student = new Student(namn, ); lärare = new Lärare(arbetstimmar,...); public int hämtaarbetstimmar() { return lärare.hämtaarbetstimmar(); Delegering StudentInterface Delegering LärareInterface Student 1 1 Kursass Lärare 1 1 Programmering tillämpningar och datastrukturer 65 Programmering tillämpningar och datastrukturer 66