Föreläsning 3 Innehåll

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

Diskutera Sortera objekt

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning 3. Stack

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

Föreläsning 2 Innehåll

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Föreläsning 3. Stack

Testning av program. Verklig modell för programutveckling

Programmering fortsättningskurs

Föreläsning 4 Innehåll

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Föreläsning 10 Innehåll

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Föreläsning 3-4 Innehåll

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

DAT043 - föreläsning 8

Föreläsning 1-2. Språkkonstruktioner i Java. Introduktion till delar av Javas klassbibliotek

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

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

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

EDAA01 Programmeringsteknik - fördjupningskurs

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

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

Länkade strukturer, parametriserade typer och undantag

Föreläsning 9 Innehåll

Föreläsning 1-2 Innehåll. EDAA01 Programmeringsteknik - fördjupningskurs. Detta kan du... Förkunskaper

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Länkade strukturer. (del 2)

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

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 2 Innehåll

Objektorienterad programmering med Java, Generics

Föreläsning 3-4 Innehåll

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Föreläsning 1-2 Innehåll. EDAA01 Programmeringsteknik - fördjupningskurs. Detta kan du... Förkunskaper

Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund

Generiska konstruktioner. Kursbokens kapitel 13

DAT043 Objektorienterad Programmering

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Kopiering av objekt i Java

Föreläsning 14 Innehåll

Repetition av OOP- och Javabegrepp

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Repetition av OOP- och Javabegrepp

Arrayer. results

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

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

1 Comparator & Comparable

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

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

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

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

OOP Objekt-orienterad programmering

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning REPETITION & EXTENTA

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Klassen javax.swing.timer

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

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

Objektorienterad Programmering (TDDC77)

Stackar, köer, iteratorer och paket

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

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

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

Föreläsning 12 Innehåll

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

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

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

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

Programmering, minneshjälp för den glömske

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Testning och felhantering

Föreläsning 12. Länkade listor

Objektorienterad Programmering (TDDC77)

Datastrukturer. föreläsning 3. Stacks 1

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

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

Föreläsning 5-6 Innehåll

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

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

Uno Holmer, Chalmers, :17 Uno Holmer, Chalmers, :17

Objektorienterad programmering

Generisk klass med typparameter Inre klass - ListIterator

LUNDS TEKNISKA HÖGSKOLA EDAA01 Programmeringsteknik fördjupningskurs Institutionen för datavetenskap HT 2015

Algoritmer. Två gränssnitt

Transkript:

Föreläsning 3 Innehåll Jämföra element interfacen Comparable och och Comparator Implementera generiska klasser Exceptions Dokumentationekommentarer javadoc Enhetstestning - junit Datavetenskap (LTH) Föreläsning 3 VT 2018 1 / 52

Diskutera Sortera objekt Metoden sort är en statisk metod i klassen Arrays. Den sorterar vektorn som skickas med som argument. Vad tror du händer när följande rader exekveras? Förklara varför? Fundera på hur elementen jämförs. Person[] persons = new Person[4]; persons[0] = new Person("Kili", 1); persons[1] = new Person("Balin", 2); persons[2] = new Person("Dori", 4); persons[3] = new Person("Fili", 3); Arrays.sort(persons); for(person p : persons) { System.out.println(p); Datavetenskap (LTH) Föreläsning 3 VT 2018 2 / 52

Vad händer inuti sort? Inuti metoden sort måste elementen jämföras (mindre än, större än). Anropet Arrays.sort(persons) kräver att klassen Person implementerar interfacet Comparable och har en metod compareto. Inuti sort används Comparable som typ för de element som ska sorteras. Vid jämförelser anropas metoden compareto. Det är alltså i compareto man bestämmer hur elementen ska jämföras och vad de ska sorteras efter. Om klassen Person inte implementerar Comparable genereras ClassCastException vid exekveringen. Datavetenskap (LTH) Föreläsning 3 VT 2018 3 / 52

Interfacet Comparable public interface Comparable<T> { /** * Compares this object with the specified object for order. * Returns a negative integer, zero, or a positive integer as * this object is less than, equal to, or greater than the * specified object. */ public int compareto(t x); Objekt av klasser som implementerar detta interface går att jämföra med varandra och kan t.ex. sorteras. Datavetenskap (LTH) Föreläsning 3 VT 2018 4 / 52

Implementering av interfacet Comparable Exempel public class Person implements Comparable<Person> { private String name; private int id;... public int compareto(person obj) { return Integer.compare(id, obj.id); Datavetenskap (LTH) Föreläsning 3 VT 2018 5 / 52

Diskutera Implementering av interfacet Comparable Hur ska metoden compareto se ut ifall man istället vill sortera personerna med avseende på namn? public class Person implements Comparable<Person> { private String name; private int id;... public int compareto(person obj) { Datavetenskap (LTH) Föreläsning 3 VT 2018 6 / 52

Jämföra likhet Metoderna compareto och equals Interfacet Comparable innehåller bara metoden compareto. Men för klasser som implementerar interfacet Comparable finns det två sätt att jämföra avseende likhet: Person p1 =...; Person p2 = ;... if (p1.compareto(p2) == 0) {... if (p1.equals(p2)) {... Båda sätten att jämföra bör ge konsistenta resultat. Därför bör metoderna equals och compareto jämföra samma attribut. Datavetenskap (LTH) Föreläsning 3 VT 2018 7 / 52

Interfacet Comparator Ibland passar inte/fungerar inte lösningen med Comparable. T.ex. om man vill kunna jämföra objekt på olika sätt. klassen redan implementerar Comparable och jämförelsen i compareto görs på ett annat sätt än man vill. Interfacet Comparator ger oss möjlighet att jämföra objekt av en klass på flera olika sätt. public interface Comparator<T> { /** * Compares its two arguments for order. * Returns a negative integer, zero, or a positive * integer as the first argument is less than, * equal to, or greater than the second. */ int compare(t e1, T e2); Datavetenskap (LTH) Föreläsning 3 VT 2018 8 / 52

Implementera interfacet Comparator Antag att personerna i vektorn persons ska sorteras efter namn. Vi kan då skriva en klass som implementerar Comparator: public class NameComparator implements Comparator<Person> { public int compare(person p1, Person p2) { return p1.getname().compareto(p2.getname()); Observera att: Metoden compare ligger i en egen klass (och inte i klassen Person). Man måste därför anropa metoder för att få tag på namnen. När vi jämför namnen använder vi metoden compareto i klassen String. Datavetenskap (LTH) Föreläsning 3 VT 2018 9 / 52

Sortera med hjälp av komparatorobjekt För att sortera väljer vi en sort-metod med möjlighet att skicka med ett objekt av typen Comparator: Arrays.sort(persons, new NameComparator()); Inuti sort anropas metoden compare på NameComparator-objektet när två element ska jämföras. Datavetenskap (LTH) Föreläsning 3 VT 2018 10 / 52

Diskutera Antag att vi har en vektor words av typen String[]. Strängarna i vektorn ska sorteras efter avtagande längd: Arrays.sort(words, new StringLengthComparator()); Skriv klart metoden compare så att sorteringen fungerar: public class StringLengthComparator implements Comparator<String> { public int compare(string s1, String s2) { Datavetenskap (LTH) Föreläsning 3 VT 2018 11 / 52

Kortare kod med lambdauttryck Jämför de två tidigare exemplen med klasser som implementerar interfacet Comparator. Det som skiljer är framför allt hur jämförelsen går till, för övrigt är det bara att följa samma mönster. Det vi egentligen vill skicka med som argument till sort är den kodsnutt som ska exekveras vid jämförelser. Det kan vi göra med hjälp av ett lambdautryck: Arrays.sort(persons,(p1,p2)-> p1.getname().compareto(p2.getname()); Datavetenskap (LTH) Föreläsning 3 VT 2018 12 / 52

Lambdauttryck kort förklaring Arrays.sort(persons,(p1,p2)-> p1.getname().compareto(p2.getname()); I bakgrunden skapas ett objekt (med en metod compare) som skickas med som argument till sort. Men vi slipper skriva motsvarande klass. p1 och p2 motsvarar de två parametrarna i compare. Efter -> finns det uttryck vars värde compare ska retunera. Kompilatorn gissar typen för p1 och p2 av sammanhanget. Att det handlar om metoden compare kan kompilatorn också lista ut eftersom det är den enda abstrakta metoden i interfacet Comparator. Lambdauttryck kommer att behandlas utförligare senare under kursen. Datavetenskap (LTH) Föreläsning 3 VT 2018 13 / 52

Diskutera Antag att vi har en vektor words av typen String[]. Strängarna i vektorn ska sorteras efter avtagande längd. Skriv klart anropet av sort: Arrays.sort(words, (s1, s2) -> Datavetenskap (LTH) Föreläsning 3 VT 2018 14 / 52

Generiska klasser Man kan deklarera en eller flera typparametrar när man definierar en klass: public class ArrayList<E> {... En typparameters namn brukar bestå av en versal (stor bokstav). E som i element, T som i type... När man använder klassen ska man ange ett typargument (ett klassnamn): ArrayList<Integer> mylist = new ArrayList<Integer>(); Datavetenskap (LTH) Föreläsning 3 VT 2018 15 / 52

Icke-generisk lista Risk för fel I tidigare versioner av Java fanns inte generik. Istället användes typen Objekt som generell typ. Klasen Object är superklass till alla andra klasser. En variabel av typen Object kan referera till vilka slags objekt som helst. Problemet är att man kan blanda olika slags objekt hur som helst i listan. ArrayList list = new ArrayList(); list.add("41"); list.add("42"); list.add(43); // Ok, men förmodligen fel Datavetenskap (LTH) Föreläsning 3 VT 2018 16 / 52

Icke-generisk lista ArrayList, skiss av implementering public class ArrayList { private Object[] data; private int size; public ArrayList() { data = new Object[10]; public boolean add(object e) {... public Object get(index i) {... Datavetenskap (LTH) Föreläsning 3 VT 2018 17 / 52

Generisk lista ArrayList<E>, skiss av implementering public class ArrayList<E> { private E[] data; private int size; public ArrayList() { data = (E[]) new Object[10]; public boolean add(e e) {... public E get(index i) {... <E> är deklarationen av typparametern E. När klassen används ersätts E av ett typargument (en riktig klass): ArrayList<Integer> list = new ArrayList<Integer>(); Datavetenskap (LTH) Föreläsning 3 VT 2018 18 / 52

Restriktioner för typparametrar Typparametrar kan inte användas för att skapa objekt: public class SomeClass<E> { E e = new E(); // FEL... En vektor som ska användas internt i den generiska klassen kan skapas så här: data = (E[]) new Object[10]; (I en metod som ska returnera en vektor bör man istället använda metoden Array.newInstance.) Datavetenskap (LTH) Föreläsning 3 VT 2018 19 / 52

Fördel med generiska klasser Undviker fel I en generisk lista med typparameter kan vi bara sätta in ett slags element: ArrayList<String> list = new ArrayList<String>(); list.add("41"); list.add("42"); list.add(43); // FEL, upptäcks vid kompileringen Slipper göra explicita typkonverteringar vid anrop av metoder som get. Ett anrop av get på listan i exemplet returnerar ett objekt av typen String. String s = list.get(); I den icke-generiska listan returneras ett element av typen Object. String s = (String) list.get(); Datavetenskap (LTH) Föreläsning 3 VT 2018 20 / 52

Implementera en generisk klass Programexempel Uppgift Skriv en klass som implementerar den abstrakta datatypen stack. push pop Datavetenskap (LTH) Föreläsning 3 VT 2018 21 / 52

Vad finns färdigt i Javas klassbibliotek? I Javas klassbibliotek har man inte infört något interface för ADT:n Stack. Det finns en klass Stack, som ärver en annan klass Vector. Interfacet Deque i java.util innehåller bl. a. de operationer som ska finnas för en ADT Stack: lägg ett element överst på stacken push(e) eller addfirst(e) tag bort och returnera översta elementet pop() eller removefirst() returnera översta elementet peek() eller peekfirst() Exempel på klasser som implementerar interfacet Deque är ArrayDeque och LinkedList. Dessa klasser innehåller många metoder och inte bara de vanliga stack-operationerna. Lätt att råka anropa fel metod. Datavetenskap (LTH) Föreläsning 3 VT 2018 22 / 52

Om man behöver en stack-klass Använd en av Javas klasser, t.ex. ArrayDeque eller LinkedList. Fördelar: Testad och färdig klass, bara att använda. Nackdelar: För många metoder. Lätt att råka anropa fel metod,t. ex. addlast istället för addfirst. Skriv en egen stackklass. Fördelar: Innehåller bara relevanta metoder. Designad för just ändamålet (kan vara effektivare, minnessnålare, specialiserad...). Nackdelar: Mer jobb, mer kod att hantera (dokumentera, testa, felsöka, begripa...). Datavetenskap (LTH) Föreläsning 3 VT 2018 23 / 52

Olika sätt att skriva en stack-klass Delegera till en av Javas klasser. Ett attribut av typen ArrayDequeu håller reda på elementen på stacken. Vektor: a null null null null null null null 1 2 3 size 3 Länkad lista: first 3 2 1 Datavetenskap (LTH) Föreläsning 3 VT 2018 24 / 52

Operationer på en stack Dessa (eller liknande) metoder förväntar man sig i en stack-klass /** Lägger e överst på stacken. */ void push(e e); /** Tar bort och returnerar översta elementet från stacken. */ E pop(); /** Returnerar översta elementet på stacken. */ E peek(); /** Undersöker om stacken är tom. */ boolean isempty(); /** Returnerar antal element i stacken. */ int size(); Datavetenskap (LTH) Föreläsning 3 VT 2018 25 / 52

Implementering av stack - delegera till annan klass Implementera en egen klass, men använd internt en annan klass. public class MultiStack<E> { private ArrayDeque<E> stack; // eller LinkedList<E> public MultiStack() { stack = new ArrayDeque<>(); public void push(e e) { stack.push(e); public E pop() { return stack.pop();... Datavetenskap (LTH) Föreläsning 3 VT 2018 26 / 52

Diskutera Vad händer om man anropar pop eller peek när stacken är tom? Antag att vi lägger till en ny metod: /** Tar bort de k översta elementen. */ public void multipop(int k) { for (int i = 0; i < k; i++) { stack.pop(); Vad ska hända om k > antal element i stacken? Datavetenskap (LTH) Föreläsning 3 VT 2018 27 / 52

Fel i program ( buggar ) Olika slags fel Kompileringsfel bryter mot språkets grammatik (syntax) eller semantik. Exempel på syntaxfel: glömt ett { Exempel på semantiskt fel: glömt deklarera en variabel innan den används. Exekveringsfel (Runtime errors eller Exceptions) upptäcks vid exekvering. Exempel: ArrayIndexOutOfBoundException, NullPointerException,... Logiska fel Programmet kan köras men ger fel resultat. Datavetenskap (LTH) Föreläsning 3 VT 2018 28 / 52

Exekveringsfel Vad händer vid ett exekveringsfel? Ett objekt ( exception ) skapas som beskriver typen av fel. Programmet avbryts. Ett felmeddelande skrivs ut där typ av fel (exception-objektets typ) stacktrace (sekvensen av metodanrop) framgår. Datavetenskap (LTH) Föreläsning 3 VT 2018 29 / 52

Exception Betyder undantag Exception genereras ( throws ) vid exekveringsfel. Man kan fånga ( catch ) exception och då själv avgöra hur felsituationen ska hanteras. Man kan skriva kod som genererar exception inuti en metod. Används om det uppstår en situation som gör det omöjligt för metoden att utföra sin uppgift (t.ex. något argument har ett konstigt värde). Datavetenskap (LTH) Föreläsning 3 VT 2018 30 / 52

Exception Olika typer av fel beskrivs av olika subklasser till klassen Exception. Exception RuntimeException IOException... ArrayIndexOutOfBoundException FileNotFoundException NullPointerException... NoSuchElementException... Datavetenskap (LTH) Föreläsning 3 VT 2018 31 / 52

Exceptions Unchecked och checked Det finns två slag av Exceptions: Unchecked Exceptions Subklass till RuntimeException. Behöver inte fångas. Exempel: ArrayIndexOutOfBoundException, NullPointerException Checked Exceptions Måste fångas någonstans i anropskedjan, annars kompileringsfel. Exempel: FileNotFoundException Datavetenskap (LTH) Föreläsning 3 VT 2018 32 / 52

Exceptions Unchecked och checked, forts Unchecked Exceptions används då felet beror på programmeraren Ex: NullPointerException eller ArrayIndexOutOfBoundsException Checked Exceptions används då felet inte beror på programmeraren Ex: FileNotFoundException om man försöker öppna en fil som inte finns Datavetenskap (LTH) Föreläsning 3 VT 2018 33 / 52

Generera exception Exempel: throw new IllegalArgumentException("amount to deposit < 0"); Mönster: throw new ExceptionClass(); throw new ExceptionClass(message); Effekt: Ett nytt exception-objekt skapas. Exekveringen av metoden avbryts. Javasystemet letar efter fångande catch-block. Datavetenskap (LTH) Föreläsning 3 VT 2018 34 / 52

Generera exception Exempel void multipop(int k) { if (k > stack.size()) { throw new IllegalArgumentException(); for (int i = 0; i < k; i++) { pop(); Datavetenskap (LTH) Föreläsning 3 VT 2018 35 / 52

Egna exceptionklasser Om man vill kan man implementera en egen exceptionklass (behövs sällan, det finns färdiga exceptionklasser i Javas bibliotek för de flesta situationer). Om den ska vara checked: public class SpellException extends Exception {... Om den ska vara unchecked: public class SomeSortOfException extends RuntimeException {... Datavetenskap (LTH) Föreläsning 3 VT 2018 36 / 52

Fånga exception Mönster try { // kod som kan generera exception catch (ExceptionClass e) { // kod för att hantera exception try { // kod som kan generera exception catch (ExceptionClass1 e1) { // kod för att hantera exception av typen ExceptionClass1 catch (ExceptionClass2 e2) { // kod för att hantera exception av typen ExceptionClass2 finally { // kod som utförs efter try-blocket eller efter catch-blocket Datavetenskap (LTH) Föreläsning 3 VT 2018 37 / 52

Fånga exceptions Exempel När man anropar en metod som genererar ett exception fångar man normalt det i en try-catch-sats: Scanner scan = null; try { // försöker öppna en fil med namnet filename scan = new Scanner(new File(fileName)); catch (FileNotFoundException e) { System.err.println("Couldn t open file " + filename); System.exit(1);... använd scan... Om exception inträffar, avbryts exekveringen av satserna i try-blocket och satserna i catch-blocket exekveras. Datavetenskap (LTH) Föreläsning 3 VT 2018 38 / 52

Fånga exceptions Forts I satsen catch(exception e) kan t.ex. följande metoder användas för att få mer information: e.printstacktrace(); som skriver ut information om raden där felet inträffat och den/de metodanrop som lett till denna rad. e.getmessage(); som returnerar en sträng med meddelande om felets art. Exempel: Scanner scan = null; try { scan = new Scanner(new File(fileName)); catch (FileNotFoundException e) { e.printstacktrace(); System.exit(1);... använd scan... Datavetenskap (LTH) Föreläsning 3 VT 2018 39 / 52

Ignorera checked exceptions Man kan ignorera en checked Exception och kasta det vidare till den anropande metoden. I så fall måste man ange det i metodrubriken i den metod där exception genereras: public Scanner createscanner(string filename) throws FileNotFoundException { // Här genereras exception om filen inte går att öppna Scanner scan = new Scanner(new File(fileName)); return scan; I den metod som anropar createscanner måste man ta hand om detta exception och kan korrigera felet på valfritt sätt. Datavetenskap (LTH) Föreläsning 3 VT 2018 40 / 52

Hantera unchecked exceptions Metod som genererar unchecked exception behöver inte ange det i sin rubrik Kan anges i kommentar Den som anropar en metod som kan generera en unchecked exception behöver inte (men kan) fånga den i en try-catch-sats Leder till exekveringsfel om de inte fångas. Datavetenskap (LTH) Föreläsning 3 VT 2018 41 / 52

Dokumentationskommentarer Exempel /** * Removes and returns the element at the top of the stack. * @return the element at the top of the stack or null if this stack is empty */ public E pop() {... /** * Removes the top k elements on the stack. * @param k the number of elements to remove * @throws IllegalArgumentException if k < 0 or k > number elements in the stack */ void multipop(int k) {... Datavetenskap (LTH) Föreläsning 3 VT 2018 42 / 52

Diskutera Vad betyder @return, @param och @throws i kommentarerna? Varför finns de med? Datavetenskap (LTH) Föreläsning 3 VT 2018 43 / 52

Dokumentationskommentar En publik metod bör förses med en kommentar på formen /**... */. Det är sedan enkelt att framställa javadoc-filer med information om klassen. Kommentaren ska innehålla: Minst en mening (avslutad med punkt) som beskriver vad metoden gör. Javadoc-taggarna @param, @return, @throws,... för att beskriva parametrar, returvärde, om exception genereras,... /** * Removes and returns the element at the top of the stack. * @return the element at the top of the stack or null if this stack is empty */ public E pop() { stack.pop(); Datavetenskap (LTH) Föreläsning 3 VT 2018 44 / 52

Pre- och postvillkor (eng. pre- och postconditions) Kontrakt på metodnivå I en metods dokumentationskommentar kan man ange pre- och postvillkor. Previllkor är villkor som måste vara uppfyllda för att en metod ska kunna utföra sin uppgift. Ibland finns inga preconditions. När de finns, är de ofta villkor som parametrarna ska uppfylla. Postvillkor beskriver hur exekvering av metoden förändrar tillståndet hos objektet. Behöver bara anges om metoden förändrar tillståndet (oftast void-metoder). För metoder som inte är void bör man i stället ge en kommentar om vad som returneras. Datavetenskap (LTH) Föreläsning 3 VT 2018 45 / 52

Pre- och postvillkor Exempel /** * Removes the top k elements on the stack. * pre: k <= the number of elements in the stack * post: k elements are removed from the stack * @param k the number of elements to remove * @throws IllegalArgumentException if k < 0 or k > number * elements in the stack */ void multipop(int k) { if (k > stack.size()) { throw new IllegalArgumentException(); for (int i = 0; i < k; i++) { pop(); Datavetenskap (LTH) Föreläsning 3 VT 2018 46 / 52

Enhetstest Enhetstest (eng. unit test) innebär att man testar en mindre del av programmet, t ex en metod eller en klass. I kursen ska vi använda ett verktyg, junit, för detta. På kursens webbsida finns ett PM om junit samt länkar till dokumentation. Datavetenskap (LTH) Föreläsning 3 VT 2018 47 / 52

Test-first Antag att du ska implementera en klass Skriv testerna för klassens metoder. Kör testet och notera att testerna inte går igenom. Implementera en metod/del av en metod i taget. Testa! Fortsätt så tills alla testerna går igenom. Datavetenskap (LTH) Föreläsning 3 VT 2018 48 / 52

Exempel på användning av stack Om ett aritmetiskt heltalsuttryck är skrivet i omvänd polsk notation (postfix notation) kan vi använda en stack för att beräkna uttryckets värde. Operatorn placeras efter sina två operander: 10 12 Ex: 3 10 12 * i postfix notation motsvarar uttrycket 3 * (10 12) i vanlig (infix) notation. Fördel: alla uttryck kan skrivas utan parenteser och deras värde kan enkelt evalueras med hjälp av en stack. Datavetenskap (LTH) Föreläsning 3 VT 2018 49 / 52

Exempel på användning av stack Algoritm skapa en tom stack s // s = new... så länge uttrycket ej är slut läs in nästa element (tal eller operator) om tal lägg talet på stacken // push annars (operator) hämta de två översta talen t1 och t2 // 2 st. pop från stacken res = resultatet av operatorn använd på t2 och t1 lägg res på stacken // push Nu ska stacken bara innehålla ett värde resultatet. Datavetenskap (LTH) Föreläsning 3 VT 2018 50 / 52

Exempel på användning av stack Evaluering av uttrycket: 3 10 12 * Läst: inget 3 10 12 - * 12 10 10-2 Stack: tom 3 3 3 3-6 Om uttrycket är korrekt så ligger till sist resultatet som enda element på stacken. Datavetenskap (LTH) Föreläsning 3 VT 2018 51 / 52

Exempel på vad du ska kunna Implementera interfacen Comparable och Comparator Implementera generiska klasser Skriva programkod för att fånga exception Skriva metoder som genererar exception Skriva dokumentationskommentarer (javadoc) Formulera testfall för en klass och använda JUnit för att testa klasser Datavetenskap (LTH) Föreläsning 3 VT 2018 52 / 52