Föreläsning 6: Undantag, filhantering samt flera användbara klasser Eva Blomqvist eva.blomqvist@liu.se Linköpings universitet Sweden November 11, 2013 1
Innehåll Undantag Filhantering Flera användbara klasser i standardbiblioteket November 11, 2013 2
Undantag November 11, 2013 3
Undantag (exception) - vad är det? Undantagssituation Onormal situation så att uppgiften i programmet inte kan genomföras - oftast någon form av "fel" som har uppstått Genom att kontrollera värden och inmatningar kan vi undvika att undantag inträffar Exempel: om användaren uppmanas att mata in ett tal mellan 1 och 10 - kontrollera med en if-sats att värdet ni fick in faktiskt är mellan 1 och 10, annars t ex fråga igen Generella metoder, t ex i Javas standardbilbiotek kan inte veta hur du vill använda dem - istället kastas ett undantag när något oväntat inträffar Ansvaret faller på ditt program, där metoden används, att bestämma hur undantaget ska hanteras! Hanteras inte undantaget så att programmet kan köra vidare avslutas det Kasta ett undantag = skapa ett undantagsobjekt som innehåller information om undantaget och göra det tillgängligt för resten av programmet (=throw) November 11, 2013 4
Skapa och kasta ett undantag Metod som returnerar elementet på en angiven position i en array public static int hamtaelement(int[] arrayen, int position) if (position >= arrayen.length) throw new ArrayIndexOutOfBoundsException("Felaktigt index!!"); else return arrayen[position]; November 11, 2013 5
Skapa och kasta ett undantag (forts.) public class Undantag public static void main (String[] args) int[] v = 1,2,3; int element = hamtaelement(v,3); System.out.println("Elementet är: " + element); public static int hamtaelement(int[] v, int position) if (position >= v.length) throw new ArrayIndexOutOfBoundsException("Felaktigt index!!"); else return v[position]; November 11, 2013 6
Skapa och kasta ett undantag (forts.) public class Undantag public static void main (String[] args) int[] v = 1,2,3; int element = hamtaelement(v,3); System.out.println("Elementet är: " + element); public static int hamtaelement(int[] v, int position) if (position >= v.length) ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException("Felaktigt index!!"); throw e; else return v[position]; November 11, 2013 7
Undantagsmeddelande ("stack trace") Typ av undantag Mitt meddelande På vilken rad i huvudprogrammet undantaget dök upp På vilken rad inne i metoden undantaget kastades November 11, 2013 8
Deklarera ett undantag (överkurs) public class Undantag public static void main (String[] args) int[] v = 1,2,3; int element = hamtaelement(v,3); System.out.println("Elementet är: " + element); public static int hamtaelement(int[] v, int position) throws ArrayIndexOutOfBoundsException if (position >= v.length) throw new ArrayIndexOutOfBoundsException("Felaktigt index!!"); else return v[position]; November 11, 2013 9
När måste man deklarera ett undantag? (överkurs) Kontrollerade undantag måste deklareras "checked exception" Sådana undantag som man kan anta att programmet vill kunna hantera - information till andra som använder dina metoder Exempel: System.in.read() kastar checked exceptions, t ex när man försöker läsa från en fil som inte finns Okontrollerade undantag måste inte (men kan) deklareras "unchecked exception" November 11, 2013 10
Fånga och hantera undantag try //Den vanliga koden, dvs det programmet ska utföra //Här bevakar programmet om ett undantag kastas catch (TypAvException e) //Kod som exekveras endast om ett undantag av //den givna typen kastas inne i try-blocket November 11, 2013 11
Exempel: fånga och hantera public class UndantagHanteras public static void main (String[] args) int[] v = 1,2,3; try int element = hamtaelement(v,3); System.out.println("Elementet är: " + element); catch (ArrayIndexOutOfBoundsException e) System.out.println(e); System.out.println("Efter catch-satsen"); public static int hamtaelement(int[] v, int position) if (position >= v.length) throw new ArrayIndexOutOfBoundsException("Felaktigt index!!"); else return v[position]; November 11, 2013 12
Exempel: fånga och hantera public class UndantagHanteras public static void main (String[] args) int[] v = 1,2,3; try int element = hamtaelement(v,3); System.out.println("Elementet är: " + element); catch (ArrayIndexOutOfBoundsException e) System.out.println(e); int element = hamtaelement(v,2); System.out.println("Sista elementet är: " + element); System.out.println("Efter catch-satsen"); public static int hamtaelement(int[] v, int position) if (position >= v.length) throw new ArrayIndexOutOfBoundsException("Felaktigt index!!"); else return v[position]; 13
Exempel: fånga och hantera (forts.) public class UndantagHanteras public static void main (String[] args) int[] v = 1,2,3; try int element = hamtaelement(v,3); System.out.println("Elementet är: " + element); catch (ArrayIndexOutOfBoundsException e) e.printstacktrace(); System.out.println("Efter catch-satsen"); public static int hamtaelement(int[] v, int position) if (position >= v.length) throw new ArrayIndexOutOfBoundsException("Felaktigt index!!"); else return v[position]; 14
Exempel: fånga och hantera (forts.) public class UndantagHanteras public static void main (String[] args) int[] v = 1,2,3; try int element = hamtaelement(v,3); System.out.println("Elementet är: " + element); catch (ArrayIndexOutOfBoundsException e) System.out.println(e); System.exit(0); System.out.println("Efter catch-satsen"); public static int hamtaelement(int[] v, int position) if (position >= v.length) throw new ArrayIndexOutOfBoundsException("Felaktigt index!!"); else return v[position]; 15
Hantera olika undantag - flera catch-satser try //Den vanliga koden, dvs det programmet ska utföra //Här bevakar programmet om ett undantag kastas catch (TypAvException e) //Kod som exekveras endast om ett undantag av //den givna typen kastas inne i try-blocket catch (AnnanTypAvException e) //Kod som exekveras endast om ett undantag av //den givna typen kastas inne i try-blocket November 11, 2013 16
Undvik undantag! Försök att förutse alla situationer som kan uppstå i ditt program och hantera dem innan de blir undantag Exempel: kontrollera inmatade värden innan de används Exempel: kontrollera att ett index är mindre än längden på en array eller sträng innan ni försöker hämta ett element Exempel: kontrollera att en variabel innehåller ett värde, dvs inte är lika med "null" innan ni utför en operation på variabeln Om undantag inte kan undvikas - försök att hantera dem så att programmet kan fortsätta -> robust program! Exempel: om användaren matar in ett värde som inte går att hantera utan ett undantag kastas - uppmana användaren att mata in ett nytt värde och fortsätt exekveringen November 11, 2013 17
Exempel: undvika undantag public class UndantagUndviks public static void main (String[] args) int[] v = 1,2,3; int position = 3; if (position >= 0 && position < v.length) int element = hamtaelement(v,position); System.out.println("Elementet är: " + element); else System.out.println("Felaktigt index!"); public static int hamtaelement(int[] v, int position) return v[position]; 18
Filhantering Paket: java.io November 11, 2013 19
Strömmar 00001100 00110011 10001101 01110011 November 11, 2013 20
Strömmar till disk - disköverföring är långsamt 00001100 00110011 10001101 01110011 November 11, 2013 21
Buffrad utmatning - samla ihop en lämplig datamängd innan utmatning 100 00110011 10001101 01110011 November 11, 2013 22
Olika typer av strömmar Dataströmmar Värden av olika primitiva datatyper Teckenströmmar Överför tecken från dess Unicode-representation (två byte) internt i vårt program till t ex dess ASCII-kod i en textfil (en byte) - transformation + överföring Objektströmmar Överföra instanser av klasser Lagrar typen av objekt (klass) och de data som ingår November 11, 2013 23
Standardin- och utmatning Vi har redan sett (och använder för labbarna) java.util.scanner för att läsa in rader, eller primitiva värden Finns även metoder för att läsa in tecken ett och ett (OBS! ni behöver inte dessa i labbarna - om ni använder dem, se upp med "skräptecken" som ligger kvar i bufferten) System.in med sin metod read() - teckenström Det finns även varianter som lagrar data i en buffert först BufferedReader! BufferedWriter! flush() framtvingar utmatning November 11, 2013 24
Representera kataloger och filer java.io.file representation av en fil eller katalog så att man kan hänvisa till den i sitt program Skapa objekt: File katalog = new File("minkatalog"); Skapar ett objekt av typen File som representerar en fil eller katalog i den aktuella katalogen (annars måste sökväg anges) med det namnet OBS! Betyder inte att filen/katalogen finns eller skapas! katalog.exists() - true om fil eller katalog med det namnet finns Kontrollera om det är en fil eller katalog katalog.isfile() - true om det är en fil katalog.isdirectory() - true om det är en katalog Hämta sökvängen till filen eller katalogen String s = katalog.getcanonicalpath();! Lista kataloger och filer String[] lista = katalog.list();! November 11, 2013 25
Representera kataloger och filer (forts.) Ändra i filsystemet OBS! var försiktiga när ni experimenterar - ni kan radera/ ändra i viktiga filer Skapa fil: katalog.createnewfile()! Skapa katalog: katalog.mkdir()! Ta bort fil eller katalog (katalog raderas bara om den är tom): katalog.delete()! November 11, 2013 26
Läsa och skriva till fil Paketet java.io innehåller två kategorier av klasser för att läsa och skriva till fil XXXReader och XXXWriter hanterar tecken (char) genom deras Unicode-koder - metoderna read() och write() FileReader och FileWriter - grundklasser för att hantera filer - glöm inte att stänga strömmen med close()! XXXInputStream och XXXOutputStream hanterar byte (binärfiler) - metoderna read() och write() read() returnerar -1 vid "end of file" (EOF), dvs när filen är slut Aktuell katalog i Eclipse Workspace? Oftast projektkatalogen... November 11, 2013 27
Textfiler OBS! Det finns flera olika varianter (mer specifika klasser) för att läsa in text och annan information från fil - läs Javadoc för de klasser som kan vara aktuella och välj den som har de metoder ni behöver! På labbarna behöver ni bara FileReader/Writer och BufferedReader/Writer Till projektet kan ni behöva andra klasser.. Läsa in tecken från textfil med en FileReader FileReader fr = new FileReader(new File("minfil.txt")); char c = (char) fr.read();! read() returnerar -1 vid filslut när inmatningen är klar - stäng strömmen fr.close();! Läsa in rader med text från textfil med en BufferedReader FileReader fr = new FileReader(new File("minfil.txt")); BufferedReader br = new BufferedReader(fr); String s = br.readline();! null vid filslut November 11, 2013 28
Textfiler (forts.) Skriva tecken till textfil med en FileWriter FileWriter fw = new FileWriter(new File("minfil.txt")); fw.write('a'); fw.close();! Lägga till i slutet av filen: FileWriter fw = new FileWriter(!!!!new File("minfil.txt"), true); fw.write('a'); fw.close();! eller använd metoden append()! Skiva rader med text till textfil med en BufferedWriter FileWriter fw = new FileWriter(new File("minfil.txt")); BufferedWriter bw = new BufferedWriter(fw); bw.write("en textsträng som skrivs till filen."); bw.close();! November 11, 2013 29
Mer om Javas standardbibliotek November 11, 2013 30
Olika typer av metoder public static-metoder public - metoden kan anropas från andra klasser (annars hade vi inte kunnat använda den alls!) static - metoden finns i själva klassen, dvs vi behöver inte först skapa ett nytt objekt av klassen för att använda metoden Exempel: instansmetod för klassen String - inte static String s = "hej"; //skapar en ny instans av klassen String s = s.touppercase(); //anropar metoden touppercase() på instansen! Exempel: static-metod för klassen String String s = String.valueOf('A'); //anropar metoden valueof() direkt från klassen String! Vi återkommer till vad "klassmetod" och "instansmetod" betyder i nästa del av kursen, men ni behöver vara uppmärksamma på hur metoder ska anropas när ni använder klasser ur Javas standardbibliotek! November 11, 2013 31
Klassen Math Klassen Math ligger i paketet java.lang - OBS detta paket importeras alltid, dvs du måste inte inte skriva java.lang.math eller import java.lang.math! Konstanter och metoder för matematiska beräkningar Alla är konstanter och metoder är public static, dvs vi skapar ingen instans av klassen utan använder dess konstanter och metoder direkt kom ihåg: konstanter skrivs vanligen med versaler, t ex PI! Exempel: konstanten pi double radie = 10.0; double omkrets = 2 * radie * Math.PI;! Exempel: kvadratroten ur ett tal - metoden sqrt double roten = Math.sqrt(25.0);! Exempel: slumptal - olika tal (0.0-1.0) vid varje exekvering double slump = Math.random();! November 11, 2013 32
Klasser som representerar de primitiva datatyperna - omslagsklasser ("wrapper") För varje primitiv datatyp finns en motsvarande klass i paketet java.lang byte!!byte short!!short int!!!integer long!!long float!!float double!!double char!!character boolean!!boolean! Varför? - klasserna innehåller ett antal metoder och konstanter som hjälper till att hantera värden av dessa typer November 11, 2013 33
Omslagsklasser - "bra att ha" metoder Omvandla mellan olika typer av tal -> type cast Omvandla tal till textsträngar?? vi kan använda omslagsklassen för taltypen (eller metoden valueof() i klassen String) Alla typer har en metod tostring() för att omvandla från värden till en textsträng metoden är public static! Exempel: heltal till sträng int i = 2345; String s = Integer.toString(i);! Exempel: decimaltal till sträng double d = 2.345; String s = Double.toString(d);! November 11, 2013 34
Omslagsklasser - "bra att ha" metoder Tvärt om: Omvandla textsträngar till tal?? vi kan använda omslagsklassen för taltypen Alla taltyper har en metod parse...() för att omvandla från textsträng till värden metoden är public static! Exempel: sträng till heltal String s = "2345"; int i = Integer.parseInt(s);! Exempel: sträng till decimaltal String s = "2.345"; double d = Double.parseDouble(s);! November 11, 2013 35
Omslagsklasser - "bra att ha" metoder Hantera tecken - public static metoder i Character! boolean isletter(char c)! boolean islowercase(char c)! boolean isuppercase(char c)! boolean isdigit(char c)! boolean isletterordigit(char c)! boolean iswhitespace(char c)! char touppercase(char c)! char islowercase(char c)! Exempel: tester på en bokstav char bokstav = 'A'; boolean b1 = Character.isLetter(bokstav); //sant boolean b2 = Character.isLowerCase(bokstav); //falskt char litenbokstav = Character.toLowerCase(bokstav)! November 11, 2013 36
Klassen Arrays - repetition Tillhör paketet java.util - måste importeras, eller så skriver ni det fullständiga namnet Innehåller metoder för att hantera arrayer på olika sätt Exempel: jämföra arrayer int[] v1 = 4,2,3; int[] v2 = 4,2,3; int[] v3 = 1,2,2; boolean lika12 = Arrays.equals(v1,v2); //sant boolean lika23 = Arrays.equals(v2,v3); //falskt! Exempel: sortera värden i en array char[] v4 = 's','d','a'; Arrays.sort(v1); //v1 kommer vara 2,3,4 Arrays.sort(v4); //v4 kommer vara 'a','d','s'! November 11, 2013 37
Systemtid och fördröjning Klassen System för att hantera systemtid long tid = System.currentTimeMillis(); Ger aktuell tid enligt systemets klocka. Anges i antal millisekunder från midnatt 1 januari 1970 (!!) Få programmet att vänta 7 sekunder: while (System.currentTimeMillis() - tid < 7000);! OBS! - ineffektiv lösning, kontrollerar hela tiden Bättre lösning: Thread.sleep(7000); Programkörningen läggs i "viloläge" i 7 sekunder - resurserna släpps fria att användas av andra program som körs November 11, 2013 38
Att importera en klass class UpprepaFor public static void main (String[] args) java.util.scanner in = new java.util.scanner(system.in); int tal = 0; for (int rakna = 1; rakna <= 10; rakna++) System.out.println("Loopen körs gång nr " + rakna); System.out.print("Skriv ett heltal: "); tal = in.nextint(); System.out.println("Talet är: " + tal); System.out.println("Slut!"); November 11, 2013 39
Att importera en klass import java.util.scanner; class UpprepaFor public static void main (String[] args) Scanner in = new Scanner(System.in); int tal = 0; for (int rakna = 1; rakna <= 10; rakna++) System.out.println("Loopen körs gång nr " + rakna); System.out.print("Skriv ett heltal: "); tal = in.nextint(); System.out.println("Talet är: " + tal); System.out.println("Slut!"); November 11, 2013 40
Nycklar och värden - Exempel: HashMap (java.util.hashmap) Exempel: mappa personnummer till ett namn - personnummer är en unik nyckel, vi vill kunna slå upp en persons namn m h a personnumret En HashMap lagrar värden baserat på en unik nyckel Nyckeln och värdena kan vara av olika typ, men alla nycklar resp. alla värden måste ha samma typ Vi skapar en HashMap enligt följande: HashMap<Integer,String> personkatalog = new HashMap();! Metoden "put" lägger till ett nyckel-värde par i katalogen, "get" hämtar värdet för en specifik nyckel 701115-0932 -> Hans Hansson 701115-0932 -> Anders Andersson November 11, 2013 41 701115-0932 -> Maria Larsson...
Tillbaka till webbshoppen (igen) Skulle vi kunna använda en HashMap här? Vad sägs om två!? - En för produkternas priser och en för antal som en specifik användare vill köpa Nycklar? Priserna: Produkt-ID (int) Inköpen: Produkt-ID (int) Värden? Priserna: Pris pers st (double) Inköpen: Antal (int) Fördel: vi behöver inte lagra alla produkter utan bara de som användaren vill köpa, och sedan slå upp priset för dessa November 11, 2013 42
Exempel webbshoppen import java.util.hashmap; import java.util.iterator; class Handla public static void main (String[] args) HashMap<Integer, Integer> artikelantal = new HashMap<Integer, Integer>(); HashMap<Integer, Double> priskatalog = new HashMap<Integer, Double>(); java.util.scanner in = new java.util.scanner(system.in); System.out.println("Ange artikelnr: "); while (in.hasnextint()) int artikelnr = in.nextint(); if (artikelnr < 0 artikelnr > 100) break; System.out.println("Ange antal: "); int antal = in.nextint(); artikelantal.put(artikelnr, antal); System.out.println("Ange artikelnr: "); Iterator<Integer> artiklar = artikelantal.keyset().iterator(); while (artiklar.hasnext()) int artikelnr = artiklar.next(); System.out.println("Ange pris för artikel " + artikelnr + ": "); double pris = in.nextdouble(); priskatalog.put(artikelnr, pris); artiklar = artikelantal.keyset().iterator(); double totalpris = 0; while (artiklar.hasnext()) int artikel = artiklar.next(); int ant = artikelantal.get(artikel); double pris = priskatalog.get(artikel); totalpris = totalpris + (ant*pris); System.out.println("Totalpriset för din order är: " + totalpris);
Exempel webbshoppen import java.util.hashmap; import java.util.iterator; class Handla public static void main (String[] args) HashMap<Integer, Integer> artikelantal = new HashMap<Integer, Integer>(); HashMap<Integer, Double> priskatalog = new HashMap<Integer, Double>(); java.util.scanner in = new java.util.scanner(system.in); System.out.println("Ange artikelnr: "); java.util.scanner while in (in.hasnextint()) = new java.util.scanner(system.in); int artikelnr = in.nextint(); if (artikelnr < 0 artikelnr > 100) break; System.out.println("Ange antal: "); int antal = in.nextint(); artikelantal.put(artikelnr, antal); System.out.println("Ange artikelnr: "); Skapa två HashMap Iterator<Integer> instanser artiklar = artikelantal.keyset().iterator(); while (artiklar.hasnext()) för att lagra dels antal per int artikelnr = artiklar.next(); artikel och dels pris per System.out.println("Ange artikel pris för artikel " + artikelnr + ": "); double pris = in.nextdouble(); priskatalog.put(artikelnr, pris); artiklar = artikelantal.keyset().iterator(); double totalpris = 0; while (artiklar.hasnext()) int artikel = artiklar.next(); int ant = artikelantal.get(artikel); double pris = priskatalog.get(artikel); totalpris = totalpris + (ant*pris); System.out.println("Totalpriset för din order är: " + totalpris); HashMap<Integer, Integer> artikelantal = new HashMap<Integer, Integer>() HashMap<Integer, Double> priskatalog = new HashMap<Integer, Double>()
Exempel webbshoppen import java.util.hashmap; import java.util.iterator; class Handla public static void main (String[] args) System.out.println("Ange HashMap<Integer, Integer> artikelantal artikelnr: = new HashMap<Integer, "); Integer>(); HashMap<Integer, Double> priskatalog = new HashMap<Integer, Double>(); while java.util.scanner (in.hasnextint()) = new java.util.scanner(system.in); System.out.println("Ange artikelnr: "); while (in.hasnextint()) int artikelnr = in.nextint(); int artikelnr = in.nextint(); if (artikelnr < 0 artikelnr > 100) break; System.out.println("Ange antal: "); antal: "); int antal = in.nextint(); int antal artikelantal.put(artikelnr, = in.nextint(); antal); System.out.println("Ange artikelnr: "); artikelantal.put(artikelnr, antal); Iterator<Integer> artiklar = artikelantal.keyset().iterator(); System.out.println("Ange artikelnr: "); while (artiklar.hasnext()) int artikelnr = artiklar.next(); System.out.println("Ange pris för artikel " + artikelnr + ": "); double pris = in.nextdouble(); priskatalog.put(artikelnr, pris); artiklar = artikelantal.keyset().iterator(); double totalpris = 0; Låt användaren mata in artikelnummer och antal för de artiklar han/hon vill köpa. vi antar att artikelnummer är postivia heltal < 100 if (artikelnr < 0 artikelnr > 100) break; while (artiklar.hasnext()) int artikel = artiklar.next(); int ant = artikelantal.get(artikel); double pris = priskatalog.get(artikel); totalpris = totalpris + (ant*pris); System.out.println("Totalpriset för din order är: " + totalpris);
Exempel webbshoppen import java.util.hashmap; import java.util.iterator; class Handla public static void main (String[] args) HashMap<Integer, Integer> artikelantal = new HashMap<Integer, Integer>(); HashMap<Integer, Double> priskatalog = new HashMap<Integer, Double>(); java.util.scanner in = new java.util.scanner(system.in); System.out.println("Ange artikelnr: "); while (in.hasnextint()) int artikelnr = in.nextint(); if (artikelnr < 0 artikelnr > 100) break; System.out.println("Ange antal: "); while (artiklar.hasnext()) int antal = in.nextint(); artikelantal.put(artikelnr, antal); int artikelnr = artiklar.next(); System.out.println("Ange artikelnr: "); Iterator<Integer> artiklar = artikelantal.keyset().iterator(); double pris = in.nextdouble(); while (artiklar.hasnext()) int artikelnr = artiklar.next(); priskatalog.put(artikelnr, pris); System.out.println("Ange pris för artikel " + artikelnr + ": "); double pris = in.nextdouble(); priskatalog.put(artikelnr, pris); Skapa en iterator över de artikelnummer som användaren matat in. För varje sådant nummer fråga användaren om priset och lagra det. Iterator<Integer> artiklar = artikelantal.keyset().iterator(); System.out.println("Ange pris för artikel " + artikelnr + ": "); artiklar = artikelantal.keyset().iterator(); double totalpris = 0; while (artiklar.hasnext()) int artikel = artiklar.next(); int ant = artikelantal.get(artikel); double pris = priskatalog.get(artikel); totalpris = totalpris + (ant*pris); System.out.println("Totalpriset för din order är: " + totalpris);
Exempel webbshoppen import java.util.hashmap; import java.util.iterator; class Handla public static void main (String[] args) HashMap<Integer, Integer> artikelantal = new HashMap<Integer, Integer>(); HashMap<Integer, Double> priskatalog = new HashMap<Integer, Double>(); java.util.scanner in = new java.util.scanner(system.in); System.out.println("Ange artikelnr: "); while (in.hasnextint()) int artikelnr = in.nextint(); if (artikelnr < 0 artikelnr > 100) break; System.out.println("Ange antal: "); int antal = in.nextint(); artikelantal.put(artikelnr, antal); System.out.println("Ange artikelnr: "); artiklar = artikelantal.keyset().iterator(); Iterator<Integer> artiklar = artikelantal.keyset().iterator(); double totalpris while (artiklar.hasnext()) = 0; int artikelnr = artiklar.next(); while (artiklar.hasnext()) System.out.println("Ange pris för artikel " + artikelnr + ": "); double pris = in.nextdouble(); int artikel = artiklar.next(); priskatalog.put(artikelnr, pris); int ant = artikelantal.get(artikel); artiklar = artikelantal.keyset().iterator(); double totalpris pris = 0; = priskatalog.get(artikel); while (artiklar.hasnext()) totalpris = int totalpris artikel = artiklar.next(); + (ant*pris); int ant = artikelantal.get(artikel); double pris = priskatalog.get(artikel); totalpris = totalpris + (ant*pris); System.out.println("Totalpriset för din order är: " + totalpris); Skapa en iterator över alla artikelnummer igen. För varje artikelnummer, hämta antalet och priset, multiplicera dem och lägg till talet till resultatvariabeln. System.out.println("Totalpriset för din order är: " + totalpris);
Programmeringsmetod November 11, 2013 48
Större program - viktigare med metod Bryta ner problemet i delsteg Använd metoder för att bryta ut delar av lösningen Se förra föreläsningen!! Använd pseudokod Rita upp på ett papper vad som ska hända i varje delsteg och "testkör" ditt program på papper November 11, 2013 49
Vad är pseudokod? Skriv ett program som läser in en persons födelseår och räknar ut personens ålder. Vad ska det här programmet göra - vilka steg behövs? Vi behöver: Uppmana användaren att mata in födelseår Läsa in födelseåret Uppmana användaren att mata in aktuellt år Läsa in aktuellt år Beräkna ålder genom att subtrahera födelseår från aktuellt år Skriva ut resultatet Vi kan skriva detta som pseudokod såhär: print "Födelseår?" read fodelse print "Nuvarande år?" read nuvarande alder = nuvarande - fodelse print "Du är " + alder November 11, 2013 50
Vad är pseudokod? (forts.) Pseudokod är en blandning av naturligt språk och ord från programmeringsspråket Syftet med pseudokod är att göra programmet mer begripligt, eller att utforma algoritmen innan man vet exakt hur man ska lösa problemet i det specifika språket Finns ingen standard eller regler, men bra tips: Använd indentering för att visa hur programmet ska vara strukturerat Vet du inte hur något ska lösas, skriv det bara i vanlig text så länge, eller anta att det löses i en metod! - du kan göra flera versioner av din pseudokod som är mer och mer detaljerade November 11, 2013 51
Exempel: från beskrivning till kod Problembeskrivning Skriv ett program som bestämmer (skriver ut) snittet av två mängder med 5 element vardera, där varje mängd ska vara representerad som en heltalsarray och matas in av användaren. November 11, 2013 52
Exempel: från beskrivning till kod Problembeskrivning Skriv ett program som bestämmer (skriver ut) snittet av två mängder med 5 element vardera, där varje mängd ska vara representerad som en heltalsarray och matas in av användaren. Bryta ner problemet Vilka delar innehåller problemet? Läsa in två arrayer som representerar mängderna Bestämma snittet och skriva ut resultatet November 11, 2013 53
Exempel: från beskrivning till kod Pseudokod - del 1 (skapa arrayer och läsa in element) array1 = ny tom array med längden 5 array2 = ny tom array med längden 5 print "Skriv in tal för mängd 1" while användaren matar in nya tal och vi inte har fyllt array1 tal = läs in heltal if tal finns inte redan i array1 lägg till tal i array1 print "Skriv in tal för mängd 2" while användaren matar in nya tal och vi inte har fyllt array2 tal2 =läs in heltal if tal2 finns inte redan i array2 lägg till tal2 i array2 November 11, 2013 54
Exempel: från beskrivning till kod Pseudokod - del 2 (bestäm och skriv ut snittet) while inte slut på array1 element = hämta aktuellt element i array1 boolean finns = finnstal(element, array2) if finns print element Är ni osäkra på någon del i programmet? bryt ut det till en metod ange returvärde och inparametrar fundera senare ut hur ni ska lösa just den metoden November 11, 2013 55
Exempel: från beskrivning till kod Pseudokod - del 2 (bestäm och skriv ut snittet) while inte slut på array1 element = hämta aktuellt element i array1 boolean finns = finnstal(element, array2) if finns print element metod: boolean finnstal (int e, heltalsarray v) finns = false for alla element i v if v == aktuellt element finns = true return finns November 11, 2013 56
Exempel: från beskrivning till kod Skriv den faktiska koden! Glöm inte test och felsökning Testa med normala värden som programmet ska hantera Testa med "gränsvärden" för alla villkor Testa med slumpvisa värden, eller värden som inte borde kunna komma in i programmet Har vi tillräckligt bra felhantering? Undvik att kasta undantag - lägg till kontroller av värden i programmet istället November 11, 2013 57
Sammanfattning Undantag Skapa och kasta undantag Fånga och hantera undantag Filhantering java.io.file representerar både filer och kataloger Finns metoder för att kolla om filen/katalogen existerar, skapa den, ta bort den, lista filer i katalogen mm Använd FileWriter och FileReader för att läsa från och skriva enskilda tecken till fil Vill du läsa in/skriva hela rader använd BufferedWriter och BufferedReader istället (kräver en FileWriter/FileReader som input när de skapas) Javas standardbibliotek - lite nya klasser "Wrapper"-klasser för grundläggande datatyper Math, Array, HashMap... November 11, 2013 58
Nästa gång...börjar vi på del 2: objektorienterad programmering November 11, 2013 59
November 11, 2013 60